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/_Woven_Actual/
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 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 */
} inweb_instructions;
@ -105,6 +108,8 @@ inweb_instructions Configuration::read(int argc, char **argv) {
args.weave_docs = FALSE;
args.import_setting = NULL;
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
switches we want, other than the standard set (such as |-help|) which it
@ -118,6 +123,8 @@ provides automatically.
@e LANGUAGE_CLSW
@e LANGUAGES_CLSW
@e SHOW_LANGUAGES_CLSW
@e TEST_LANGUAGE_CLSW
@e TEST_LANGUAGE_ON_CLSW
@e ANALYSIS_CLSG
@ -173,6 +180,10 @@ provides automatically.
L"read all language definitions in path X");
CommandLine::declare_switch(SHOW_LANGUAGES_CLSW, L"show-languages", 1,
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::begin_group(ANALYSIS_CLSG,
@ -256,6 +267,13 @@ void Configuration::switch(int id, int val, text_stream *arg, void *state) {
case SHOW_LANGUAGES_CLSW:
args->show_languages_switch = TRUE;
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:
args->catalogue_switch = TRUE;
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 (ins->inweb_mode == TRANSLATE_MODE) @<Translate a makefile@>
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@>;
}
}
@ -129,6 +130,22 @@ void Main::follow_instructions(inweb_instructions *ins) {
Languages::read_definitions(NULL);
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:
@<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 command_code; /* used only for |COMMAND_LCAT| lines: a |*_CMD| value */
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 */
int is_commentary; /* flag */
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->command_code = NO_CMD;
sl->default_defn = FALSE;
sl->plainer = FALSE;
sl->colour_as = NULL;
sl->is_commentary = FALSE;
sl->function_defined = NULL;

View file

@ -387,14 +387,29 @@ division in the current section.
code_lcat_for_body = TEXT_EXTRACT_LCAT;
code_pl_for_body = NULL;
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_pl_for_body = Languages::find_by_name(mr2.exp[0], W);
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_pl_for_body = S->sect_language;
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 {
Main::error_in_web(I"unknown bracketed annotation", L);
}
@ -405,6 +420,26 @@ division in the current section.
Regexp::dispose_of(&mr2);
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.
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

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 == BEGIN_CODE_LCAT) {
state->line_break_pending = FALSE;
LanguageMethods::reset_syntax_colouring(S->sect_language);
continue;
}
@ -292,25 +293,25 @@ add a vertical skip between them to show the division more clearly.
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, matter, L"%(...%) (%c*)")) { /* continue single */
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
state->substantive_comment);
state->substantive_comment, FALSE);
state->kind_of_material = REGULAR_MATERIAL;
Formats::item(OUT, wv, 1, I"");
Str::copy(matter, mr.exp[0]);
} else if (Regexp::match(&mr, matter, L"%(-...%) (%c*)")) { /* continue double */
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
state->substantive_comment);
state->substantive_comment, FALSE);
state->kind_of_material = REGULAR_MATERIAL;
Formats::item(OUT, wv, 2, I"");
Str::copy(matter, mr.exp[0]);
} else if (Regexp::match(&mr, matter, L"%((%i+)%) (%c*)")) { /* begin single */
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
state->substantive_comment);
state->substantive_comment, FALSE);
state->kind_of_material = REGULAR_MATERIAL;
Formats::item(OUT, wv, 1, mr.exp[0]);
Str::copy(matter, mr.exp[1]);
} else if (Regexp::match(&mr, matter, L"%(-(%i+)%) (%c*)")) { /* begin double */
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
state->substantive_comment);
state->substantive_comment, FALSE);
state->kind_of_material = REGULAR_MATERIAL;
Formats::item(OUT, wv, 2, mr.exp[0]);
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();
if (Regexp::match(&mr, matter, L"\t|(%c*)|(%c*?)")) {
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;
}
TEMPORARY_TEXT(original);
@ -338,7 +340,8 @@ in the source is set indented in code style.
DISCARD_TEXT(original);
continue;
} 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;
}
Regexp::dispose_of(&mr);
@ -364,7 +367,8 @@ and macro usage is rendered differently.
W, C, S, L, matter, concluding_comment)) continue;
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;
@<Find macro usages and adjust syntax colouring accordingly@>;
@ -399,7 +403,7 @@ hence the name of the following paragraph:
else
state->kind_of_material = CODE_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;
}
@ -501,7 +505,7 @@ otherwise, they are set flush right.
@<Complete any started but not-fully-woven paragraph@>;
if (wv->theme_match)
@<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;
if (L->category == HEADING_START_LCAT) weight = 1;
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;
if (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)) {
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);
if ((L->category == TEXT_EXTRACT_LCAT) && (pl != S->sect_language))
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@> =
filename *F = NULL;
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@>;
}
pathname *P = Languages::default_directory();
@ -415,6 +415,7 @@ typedef struct colouring_rule {
int match_prefix; /* one of the |*_RULE_PREFIX| values above */
wchar_t match_regexp_text[MAX_ILDF_REGEXP_LENGTH];
int number; /* for |number N| rules; 0 for others */
int number_of; /* for |number N of M| rules; 0 for others */
/* the conclusion: */
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_regexp_text[0] = 0;
rule->number = 0;
rule->number_of = 0;
rule->set_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+)")) {
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+)")) {
rule->match_keyword_of_colour = Languages::colour(mr.exp[0], tfp);
} 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 EXTRACT_COLOUR 'x'
@d COMMENT_COLOUR '!'
@d NEWLINE_COLOUR '\n'
@d NOT_A_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|:
=
int painter_count = 1;
void Painter::reset_syntax_colouring(programming_language *pl) {
colouring_state = PLAIN_COLOUR;
painter_count = 1;
}
@ 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.
=
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) {
int from = 0, to = Str::len(matter) - 1;
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_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;
}
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) {
@<Spot identifiers, literal text and character constants@>;
@<Spot literal numerical constants@>;
@ -190,7 +192,7 @@ takes over.
@<Now run the colouring 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
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,
text_stream *colouring, int from, int to) {
text_stream *colouring, int from, int to, int N) {
if (block == NULL) internal_error("no block");
TEMPORARY_TEXT(colouring_at_start);
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) {
switch (block->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;
case CHARACTERS_CRULE_RUN:
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,
text_stream *colouring, int from, int to, int N) {
if (rule->number > 0) {
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]) {
if (Regexp::match(&(rule->mr), matter, rule->match_regexp_text) == 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,
text_stream *colouring, int from, int to) {
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->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++)
PUT_TO(STDOUT, Str::get_at(colouring, i));
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,
text_stream *figname, int w, int h, programming_language *pl) {
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"),
figname);
filename *RF = Filenames::from_text(figname);
TEMPORARY_TEXT(ext);
Filenames::write_extension(ext, RF);
if ((pl) || (Str::eq_insensitive(ext, I".txt"))) {
if (pl == NULL) HTMLFormat::pre(OUT, NULL);
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");
}
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,
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,
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 == MACRO_MATERIAL) HTML_CLOSE("code");
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:
switch (new_material) {
case CODE_MATERIAL:
WRITE("\n");
HTMLFormat::pre(OUT, "display");
if (plainly) HTMLFormat::pre(OUT, NULL);
else HTMLFormat::pre(OUT, "display");
break;
case DEFINITION_MATERIAL:
WRITE("\n");
@ -510,7 +472,8 @@ void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_tar
switch (new_material) {
case CODE_MATERIAL:
WRITE("\n");
HTMLFormat::pre(OUT, "display");
if (plainly) HTMLFormat::pre(OUT, NULL);
else HTMLFormat::pre(OUT, "display");
break;
case MACRO_MATERIAL:
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,
int old_material, int new_material, int content) {
int old_material, int new_material, int content, int change_material) {
if (old_material != new_material) {
switch (old_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,
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,
int old_material, int new_material, int content) {
int old_material, int new_material, int content, int plainly) {
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

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-languages X read all language definitions in path X
-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:
-advance-build increment daily build code for the web

View file

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

View file

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

View file

@ -20,62 +20,62 @@ End Ifndef: "#endif; ! %S\n"
# Reserved words:
keyword Constant
keyword Array
keyword "Constant"
keyword "Array"
keyword box
keyword break
keyword child
keyword children
keyword continue
keyword default
keyword do
keyword elder
keyword eldest
keyword else
keyword false
keyword font
keyword for
keyword give
keyword has
keyword hasnt
keyword if
keyword in
keyword indirect
keyword inversion
keyword jump
keyword metaclass
keyword move
keyword new_line
keyword nothing
keyword notin
keyword objectloop
keyword ofclass
keyword or
keyword parent
keyword print
keyword print_ret
keyword provides
keyword quit
keyword random
keyword read
keyword remove
keyword restore
keyword return
keyword rfalse
keyword rtrue
keyword save
keyword sibling
keyword spaces
keyword string
keyword style
keyword switch
keyword to
keyword true
keyword until
keyword while
keyword younger
keyword youngest
keyword "box"
keyword "break"
keyword "child"
keyword "children"
keyword "continue"
keyword "default"
keyword "do"
keyword "elder"
keyword "eldest"
keyword "else"
keyword "false"
keyword "font"
keyword "for"
keyword "give"
keyword "has"
keyword "hasnt"
keyword "if"
keyword "in"
keyword "indirect"
keyword "inversion"
keyword "jump"
keyword "metaclass"
keyword "move"
keyword "new_line"
keyword "nothing"
keyword "notin"
keyword "objectloop"
keyword "ofclass"
keyword "or"
keyword "parent"
keyword "print"
keyword "print_ret"
keyword "provides"
keyword "quit"
keyword "random"
keyword "read"
keyword "remove"
keyword "restore"
keyword "return"
keyword "rfalse"
keyword "rtrue"
keyword "save"
keyword "sibling"
keyword "spaces"
keyword "string"
keyword "style"
keyword "switch"
keyword "to"
keyword "true"
keyword "until"
keyword "while"
keyword "younger"
keyword "youngest"
colouring {
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:
[[help.txt]]
= (undisplayed text from Figures/help.txt)
@ Running Inweb with |-show-languages| currently produces the following list
of programming languages for which support is provided in the standard
distribution:
[[languages.txt]]
= (undisplayed text from Figures/languages.txt)
It's easy to make new language definitions, and contributions of these are
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
the language mean.
@
As we've seen, the Contents section of a web has to specify its language.
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
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
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,
|-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
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.
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
lie inside the text |T|. For example, here is a not very useful ILD for
plain text in which all vowels are in red:
[[../Private Languages/VowelsExample.ildf as ILDF]]
= (text from Dialects/VowelsExample.ildf as ILDF)
Given the text:
= (not code)
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
the snippet. For example,
[[../Private Languages/LineageExample.ildf as ILDF]]
= (text from Dialects/LineageExample.ildf as ILDF)
acts on the text:
= (not code)
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
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:
= (not code)
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".
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:
= (not code)
if (x == 1) printf("Hello!");
@ -438,7 +444,7 @@ not a colour.
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.
This is easier to demonstrate than explain:
[[../Private Languages/AssemblageExample.ildf as ILDF]]
= (text from Dialects/AssemblageExample.ildf as ILDF)
which acts on:
= (not code)
JSR .initialise
@ -460,7 +466,7 @@ to produce:
regular expression |E|, and then runs the rules on each bracketed
subexpression in turn. (If there is no match, or there are no bracketed
terms in |E|, nothing happens.)
[[../Private Languages/EquationsExample.ildf as ILDF]]
= (text from Dialects/EquationsExample.ildf as ILDF)
acts on:
= (not code)
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,
and different rules can apply to differently numbered pieces. The notation
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:
= (not code)
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?
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,
= (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
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:
[[../Languages/ILDF.ildf as ILDF]]
= (text from Languages/ILDF.ildf as ILDF)

View file

@ -1,6 +1,6 @@
# Inweb 7
v7 'Escape to Danger' (6 April 2020)
v7 'Escape to Danger' (7 April 2020)
## 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 */
#include <stdio.h>
#ifdef PLATFORM_WINDOWS

View file

@ -1,4 +1 @@
#ifndef PLATFORM_WINDOWS
#define PLATFORM_POSIX
#endif
/* 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 */
#include <stdio.h>
#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 */
#include <stdio.h>
#define RANGE 100

View file

@ -455,12 +455,11 @@ main {
<!--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>
<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="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>
</pre>
@ -472,7 +471,7 @@ main {
<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">B_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>
<pre class="display">
<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>
<pre class="display">
<span class="plain">Green.</span>
<span class="plain">Blue.</span>

View file

@ -455,12 +455,11 @@ main {
<!--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>
<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="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>
</pre>

View file

@ -455,21 +455,19 @@ main {
<!--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>
<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>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<span class="plain">sub recolour {</span>
<span class="plain">my $text = $_[0];</span>
<span class="identifier">sub</span><span class="plain"> </span><span class="identifier">recolour</span><span class="plain"> {</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>
<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>
</pre>
@ -481,8 +479,8 @@ main {
<pre class="displaydefn">
<span class="plain">$text =~ s/red/blue/;</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">red</span><span class="plain">/</span><span class="identifier">blue</span><span class="plain">/;</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>
<p class="inwebparagraph"></p>

View file

@ -455,7 +455,6 @@ main {
<!--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>
<pre class="display">
&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>
@ -485,7 +484,6 @@ main {
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b></p>
<pre class="display">
<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>

View file

@ -463,7 +463,7 @@ simplest method possible.
<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 class="display">
@ -486,7 +486,7 @@ simplest method possible.
<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="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>
<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>
<pre class="display">
<span class="plain">3 and 5</span>
<span class="plain">5 and 7</span>
@ -512,15 +511,15 @@ simplest method possible.
<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">FALSE</span><span class="plain"> 0</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"> </span><span class="constant">0</span>
</pre>
<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">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">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">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"> &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"> = </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"> == </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">TRUE</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 [Painter] 'inweb/Tests/Test Painter'
-recipe [Inweb]
set: $INWEB = inweb/Tangled/inweb
@ -42,3 +43,24 @@
pass: 'passed'
-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
Build Date: 6 April 2020
Build Number: 1A12
Build Date: 7 April 2020
Build Number: 1A13

View file

@ -47,7 +47,6 @@ other tools or libraries to speak of, you could do worse.
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">Import: foundation</span>
</pre>
@ -70,7 +69,6 @@ Because pthread is not normally available on Windows, a special header is
supplied instead for that case.
</p>
<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">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>
<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>
</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>
<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>
</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>.
</p>
<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="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.
</p>
<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">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.
</p>
<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="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>
<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">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.)
</p>
<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">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>
<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>
@ -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>
<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>
&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>
<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>
&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>
<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">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.
</p>
<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">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>
<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="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.
</p>
<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="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>
<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">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>
<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="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.
</p>
<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">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>
<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="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>
<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_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>
<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">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>
<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">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.)
</p>
<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="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>
<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">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>
<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="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.
</p>
<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="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>
<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="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>
<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">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>
<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">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.
</p>
<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="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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -62,7 +61,6 @@ not necessarily.
efficiency's sake the caller can set them up with an initial size of her choice.
</p>
<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">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>
<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="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.
</p>
<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">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.
</p>
<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">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>:
</p>
<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="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>).
</p>
<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">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:
</p>
<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">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.
</p>
<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">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>.
</p>
<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">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:
</p>
<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">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>
<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</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>
<pre class="display">
<span class="plain">LOGIF(WHATEVER, "Heading %d skipped\n", n);</span>
</pre>
@ -76,7 +74,6 @@ not, as we please. Each has a unique number and a name of up to three words in
length.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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.
</p>
<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>
@ -239,7 +235,6 @@ the debugging log can be divided into "phases", subdivided into "stages".
This is how.
</p>
<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">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.
</p>
<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="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>
<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">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>.
</p>
<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="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.
</p>
<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">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.
</p>
<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">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>
<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="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.
</p>
<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">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>
<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">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>
<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">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>
<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">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>
<pre class="display">
<span class="plain">typedef struct thingummy {</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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">allocation_status_structure</span><span class="plain"> {</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.
</p>
<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>
@ -229,7 +226,6 @@ Each memory block consists of a header structure, followed by <code class="displ
null bytes, followed by actual data.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -244,7 +240,6 @@ null bytes, followed by actual data.
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b></p>
<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">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.
</p>
<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">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.
</p>
<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="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.)
</p>
<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">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.
</p>
<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">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:
</p>
<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="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>
<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">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>
<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>
@ -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.
</p>
<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="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.
</p>
<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">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>
<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="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>
<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">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.
</p>
<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="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>
<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">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).
</p>
<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">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>
<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">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>
<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="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.
</p>
<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">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>
<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="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:
</p>
<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>
</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>
<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">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>
<pre class="display">
<span class="plain">IMETHOD_CALL(some_object, UNUSED_METHOD_ID_MTID, I"Hello", 17)</span>
</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>.
</p>
<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>
@ -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>
<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>
</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.
</p>
<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">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.
</p>
<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">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>
<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">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.
</p>
<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="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>
<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="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.
</p>
<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">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>
<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">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.
</p>
<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="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.
</p>
<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">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):
</p>
<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">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):
</p>
<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">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>
<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">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>
<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">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:
</p>
<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">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>
<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">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>
<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="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>:
</p>
<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">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>
<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">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>
<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">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>
<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">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.
</p>
<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">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.
</p>
<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="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.
</p>
<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">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.
</p>
<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="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).
</p>
<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">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>).
</p>
<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">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>
<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">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.)
</p>
<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_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>
<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">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>
<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="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>
<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">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:
</p>
<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="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.
</p>
<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">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>
<pre class="display">
<span class="plain">/Users/bobama/Library/Inform/Extensions/Hillary Clinton/Health Care.i7x</span>
</pre>
@ -289,7 +287,6 @@ return from the function.
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">topdirpath| is |/Users/bobama/Library/Inform/Extensions</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.)
</p>
<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">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>
<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">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>
<pre class="display">
<span class="plain">-log no-memory-usage -fixtime jam marmalade</span>
</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:
</p>
<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>
</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:
</p>
<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">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>:
</p>
<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="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.
</p>
<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">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).
</p>
<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">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.
</p>
<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">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>
<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="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>
<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">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.
</p>
<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>
@ -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>
<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">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>
<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">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.
</p>
<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="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>.
</p>
<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">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.
</p>
<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="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.)
</p>
<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">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:
</p>
<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="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>
<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="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>
<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="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.)
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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>
<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">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>
<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">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>
<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">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>
<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="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>
<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">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>
<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">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.
</p>
<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">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.
</p>
<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">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.
</p>
<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">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>
<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="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>
<pre class="display">
<span class="plain">/Users/rblackmore/Documents/Fireball</span>
</pre>
@ -44,7 +43,6 @@ directory), and "filename" to mean a location of a file. For example:
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">/Users/rblackmore/Documents/Fireball/whoosh.aiff</span>
</pre>
@ -64,7 +62,6 @@ describe a folder which doesn't exist on disc.
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">/Users/rblackmore/Documents/</span>
</pre>
@ -81,7 +78,6 @@ to begin with <code class="display"><span class="extract">FOLDER_SEPARATOR</span
host file system.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -99,7 +95,6 @@ host file system.
<code class="display"><span class="extract">HOME</span></code>, if it exists.
</p>
<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">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>
<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">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.
</p>
<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">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.
</p>
<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">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>
<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">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>
<pre class="display">
<span class="plain">/Users/rblackmore/Documents/Fireball/tablature</span>
</pre>
@ -260,7 +250,6 @@ for example,
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">/Users/rblackmore/Documents/</span>
</pre>
@ -270,7 +259,6 @@ for example,
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">Fireball/tablature</span>
</pre>
@ -280,7 +268,6 @@ so it's probably not wise to use it with filenames typed in at the command
line.
</p>
<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="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.
</p>
<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">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>).
</p>
<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">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.
</p>
<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="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>
<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="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>
<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="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.
</p>
<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="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>
<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="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.
</p>
<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">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>
<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="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>
<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">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.
</p>
<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">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.
</p>
<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">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.
</p>
<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="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>
<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">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>
<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">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.
</p>
<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">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.
</p>
<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">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:
</p>
<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="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>
<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">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>
<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">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.
</p>
<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">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:
</p>
<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">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.
</p>
<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">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.
</p>
<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">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.
</p>
<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="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>
<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">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.
</p>
<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="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>
<pre class="display">
<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>
@ -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>
<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">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">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">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>
</pre>
@ -228,13 +222,14 @@ result strings grow very large), so that it's very quick to allocate and
deallocate.
</p>
<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="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="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_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="plain">}</span>
@ -259,7 +254,6 @@ deallocate.
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>So, then: the matcher itself.
</p>
<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">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="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">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="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="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>
@ -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_from appears nowhere else.</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>
<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">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="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">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="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>
@ -514,9 +527,10 @@ is literal.
<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="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="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">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>
@ -531,7 +545,6 @@ is literal.
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b></p>
<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="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">'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">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">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>
@ -576,7 +592,6 @@ For example,
<p class="inwebparagraph"></p>
<pre class="display">
<span class="plain">Regexp::replace(text, L"[aeiou]", L"!", REP_REPEATING);</span>
</pre>

View file

@ -63,7 +63,6 @@ here is just the size of the initial memory block, which is fastest to
access.
</p>
<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">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>.
</p>
<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">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.
</p>
<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="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>
<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">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>
<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="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>
<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">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>
<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">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="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
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.)
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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>
<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="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>
<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">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>
<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="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>
<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">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>
<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="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>
<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="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>
<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="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>
<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">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.
</p>
<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">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>
<pre class="display">
<span class="plain">Str::suffix_eq(I"wayzgoose", I"snow goose", N)</span>
</pre>
@ -572,7 +554,6 @@ alphabetic sorting, like <code class="display"><span class="extract">strlen</spa
for the staff of a publishing house.)
</p>
<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="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>
<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">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>
<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="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>
<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">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>
<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="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>
<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">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.
</p>
<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>

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>
<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">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>
<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="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".
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -426,7 +423,6 @@ against a linked list of tries: we'll call that an "avinue".
head node (of either sort).
</p>
<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="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.
</p>
<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="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).
</p>
<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="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>
<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">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:
</p>
<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">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>
<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">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>
<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">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>
<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="identifier">tfp</span><span class="plain">;</span>
@ -113,7 +109,6 @@ we preserve a pointer called <code class="display"><span class="extract">state</
client.
</p>
<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">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>
<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="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:
</p>
<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="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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>

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.
</p>
<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">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>
<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">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>
<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">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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -79,7 +78,6 @@ identify ebooks; we need to maintain a small dictionary, and so small that a
list is entirely sufficient.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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>
<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">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:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -163,7 +159,6 @@ pages:
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Creation. </b></p>
<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="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.)
</p>
<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">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>
<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>
&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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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.
</p>
<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">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>
<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">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>
<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">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>
<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="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>
<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">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>
<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="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>
<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="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>
<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">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>
<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">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>
<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="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>
<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="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>
<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="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>
<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="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>
<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">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>
<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="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>
<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="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.
</p>
<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="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>
<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="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.
</p>
<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="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>
<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="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:
</p>
<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">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:
</p>
<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="identifier">c</span><span class="plain">;</span>
@ -189,7 +185,6 @@ follows:
floating-point numbers:
</p>
<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="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.)
</p>
<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">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>
<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">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>
<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="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.
</p>
<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">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.
</p>
<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">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).
</p>
<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">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.
</p>
<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">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>
<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">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.
</p>
<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">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>
<pre class="display">
<span class="plain">Moonmist</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.)
</p>
<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="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>
<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">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.
</p>
<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">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.
</p>
<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">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:
</p>
<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">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.
</p>
<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="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.
</p>
<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">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>
<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">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.
</p>
<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">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.
</p>
<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="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.
</p>
<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="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span>
@ -164,7 +161,6 @@ versions.
inclusive:
</p>
<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="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>
<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">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>
<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">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.
</p>
<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">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.
</p>
<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="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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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>
<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">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>
<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">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:
</p>
<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">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>
<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">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.
</p>
<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="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.
</p>
<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="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>
<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">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>
<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="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>
<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">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.
</p>
<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">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.
</p>
<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="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.
</p>
<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">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>.
</p>
<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">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.
</p>
<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">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>
<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="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.
</p>
<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">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.
</p>
<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">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.)
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -137,7 +133,6 @@ program generated by A.
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b></p>
<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="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:
</p>
<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="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.
</p>
<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">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>
<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">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>
<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">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>
<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">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.
</p>
<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">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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -338,7 +333,6 @@ and sets out bibliographic information about the web, the sections and their
organisation, and so on.
</p>
<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">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>
<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">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>
<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="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>
<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">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>
<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="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>
<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">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>
<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">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>
<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">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>
<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">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>
<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="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>
<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">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.
</p>
<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_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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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">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="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.
</p>
<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="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">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">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>
<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">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">CATALOGUE_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="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="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::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>
<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">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="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="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="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>
@ -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>).
</p>
<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">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.
</p>
<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">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="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>
<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">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.
</p>
<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>
</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>.
</p>
<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_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>
<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>
</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>
<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>
&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="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">
&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.
</p>
<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">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">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">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>
</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="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 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>
<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.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">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="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="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="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><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="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>
<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_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 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>
@ -287,9 +311,9 @@ program: some input, some thinking, a choice of three forms of output.
<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
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
@ -307,7 +331,7 @@ line , but otherwise we impose a sensible choice based on the target.
<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>
@ -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="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>
&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>
&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="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="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.
</p>
<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>
@ -357,14 +381,14 @@ which for many small webs will be the entire thing.
<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 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>
@ -377,20 +401,20 @@ which for many small webs will be the entire thing.
<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 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>
<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="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">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">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">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>
@ -422,15 +446,15 @@ which for many small webs will be the entire thing.
<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.
</p>
<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>
@ -456,10 +480,10 @@ which for many small webs will be the entire thing.
<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">
&lt;<span class="cwebmacrodefn">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.3.3.2</span>&gt; =
<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.4.3.2</span>&gt; =
</code></p>
@ -472,14 +496,13 @@ which for many small webs will be the entire thing.
<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,
but we'll use the following wrapper when issuing an error at a line of web
source:
</p>
<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">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:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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>
<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">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="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">
&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:
</p>
<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">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>
<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">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.
</p>
<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">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:
</p>
<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">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>
<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">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.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -56,7 +55,6 @@ increments sequentially in definition order.
compare all against all:
</p>
<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="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.
</p>
<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">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.
</p>
<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">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:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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>
@ -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">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">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">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>
@ -69,11 +69,10 @@ correspond to one of these:
<p class="inwebparagraph"></p>
<p class="endnote">The structure source_line is accessed in 1/pc, 2/tr, 2/tp, 2/pm, 2/ec, 2/pn, 3/ta, 3/tw, 3/tt, 4/lm, 4/as, 4/cl, 4/is, 5/tf, 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>
<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="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">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">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">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>
@ -102,7 +102,7 @@ correspond to one of these:
<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
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:
</p>
<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">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>
<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">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.
</p>
<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="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.
</p>
<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="identifier">pmac</span><span class="plain">;</span>

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