Improved extracts and testing for the painter
This commit is contained in:
parent
37b01a8d89
commit
46c1ad0de7
131 changed files with 2330 additions and 2285 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -25,4 +25,5 @@ Tests/Test Cases/_Tangled_Actual/
|
||||||
Tests/Test Cases/_Tangled_Console/
|
Tests/Test Cases/_Tangled_Console/
|
||||||
Tests/Test Cases/_Woven_Actual/
|
Tests/Test Cases/_Woven_Actual/
|
||||||
Tests/Test Cases/_Woven_Console/
|
Tests/Test Cases/_Woven_Console/
|
||||||
|
Tests/Test Painter/_Results_Actual/
|
||||||
|
|
||||||
|
|
|
@ -42,6 +42,9 @@ typedef struct inweb_instructions {
|
||||||
int verbose_switch; /* |-verbose|: print names of files read to stdout */
|
int verbose_switch; /* |-verbose|: print names of files read to stdout */
|
||||||
int targets; /* used only for parsing */
|
int targets; /* used only for parsing */
|
||||||
|
|
||||||
|
struct programming_language *test_language_setting; /* |-test-language X| */
|
||||||
|
struct filename *test_language_on_setting; /* |-test-language-on X| */
|
||||||
|
|
||||||
struct pathname *import_setting; /* |-import X|: where to find imported webs */
|
struct pathname *import_setting; /* |-import X|: where to find imported webs */
|
||||||
} inweb_instructions;
|
} inweb_instructions;
|
||||||
|
|
||||||
|
@ -105,6 +108,8 @@ inweb_instructions Configuration::read(int argc, char **argv) {
|
||||||
args.weave_docs = FALSE;
|
args.weave_docs = FALSE;
|
||||||
args.import_setting = NULL;
|
args.import_setting = NULL;
|
||||||
args.targets = 0;
|
args.targets = 0;
|
||||||
|
args.test_language_setting = NULL;
|
||||||
|
args.test_language_on_setting = NULL;
|
||||||
|
|
||||||
@ The CommandLine section of Foundation needs to be told what command-line
|
@ The CommandLine section of Foundation needs to be told what command-line
|
||||||
switches we want, other than the standard set (such as |-help|) which it
|
switches we want, other than the standard set (such as |-help|) which it
|
||||||
|
@ -118,6 +123,8 @@ provides automatically.
|
||||||
@e LANGUAGE_CLSW
|
@e LANGUAGE_CLSW
|
||||||
@e LANGUAGES_CLSW
|
@e LANGUAGES_CLSW
|
||||||
@e SHOW_LANGUAGES_CLSW
|
@e SHOW_LANGUAGES_CLSW
|
||||||
|
@e TEST_LANGUAGE_CLSW
|
||||||
|
@e TEST_LANGUAGE_ON_CLSW
|
||||||
|
|
||||||
@e ANALYSIS_CLSG
|
@e ANALYSIS_CLSG
|
||||||
|
|
||||||
|
@ -173,6 +180,10 @@ provides automatically.
|
||||||
L"read all language definitions in path X");
|
L"read all language definitions in path X");
|
||||||
CommandLine::declare_switch(SHOW_LANGUAGES_CLSW, L"show-languages", 1,
|
CommandLine::declare_switch(SHOW_LANGUAGES_CLSW, L"show-languages", 1,
|
||||||
L"list programming languages supported by Inweb");
|
L"list programming languages supported by Inweb");
|
||||||
|
CommandLine::declare_switch(TEST_LANGUAGE_CLSW, L"test-language", 2,
|
||||||
|
L"test language X on...");
|
||||||
|
CommandLine::declare_switch(TEST_LANGUAGE_ON_CLSW, L"test-language-on", 2,
|
||||||
|
L"...the code in the file X");
|
||||||
CommandLine::end_group();
|
CommandLine::end_group();
|
||||||
|
|
||||||
CommandLine::begin_group(ANALYSIS_CLSG,
|
CommandLine::begin_group(ANALYSIS_CLSG,
|
||||||
|
@ -256,6 +267,13 @@ void Configuration::switch(int id, int val, text_stream *arg, void *state) {
|
||||||
case SHOW_LANGUAGES_CLSW:
|
case SHOW_LANGUAGES_CLSW:
|
||||||
args->show_languages_switch = TRUE;
|
args->show_languages_switch = TRUE;
|
||||||
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
|
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
|
||||||
|
case TEST_LANGUAGE_CLSW:
|
||||||
|
args->test_language_setting =
|
||||||
|
Languages::read_definition(Filenames::from_text(arg));
|
||||||
|
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
|
||||||
|
case TEST_LANGUAGE_ON_CLSW:
|
||||||
|
args->test_language_on_setting = Filenames::from_text(arg);
|
||||||
|
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
|
||||||
case CATALOGUE_CLSW:
|
case CATALOGUE_CLSW:
|
||||||
args->catalogue_switch = TRUE;
|
args->catalogue_switch = TRUE;
|
||||||
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
|
Configuration::set_fundamental_mode(args, ANALYSE_MODE); break;
|
||||||
|
|
|
@ -100,6 +100,7 @@ void Main::follow_instructions(inweb_instructions *ins) {
|
||||||
if (no_inweb_errors == 0) {
|
if (no_inweb_errors == 0) {
|
||||||
if (ins->inweb_mode == TRANSLATE_MODE) @<Translate a makefile@>
|
if (ins->inweb_mode == TRANSLATE_MODE) @<Translate a makefile@>
|
||||||
else if (ins->show_languages_switch) @<List available programming languages@>
|
else if (ins->show_languages_switch) @<List available programming languages@>
|
||||||
|
else if ((ins->test_language_setting) || (ins->test_language_on_setting)) @<Test a language@>
|
||||||
else if (ins->inweb_mode != NO_MODE) @<Analyse, tangle or weave an existing web@>;
|
else if (ins->inweb_mode != NO_MODE) @<Analyse, tangle or weave an existing web@>;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -129,6 +130,22 @@ void Main::follow_instructions(inweb_instructions *ins) {
|
||||||
Languages::read_definitions(NULL);
|
Languages::read_definitions(NULL);
|
||||||
Languages::show(STDOUT);
|
Languages::show(STDOUT);
|
||||||
|
|
||||||
|
@ And this:
|
||||||
|
|
||||||
|
@<Test a language@> =
|
||||||
|
if ((ins->test_language_setting) && (ins->test_language_on_setting)) {
|
||||||
|
TEMPORARY_TEXT(matter);
|
||||||
|
TEMPORARY_TEXT(coloured);
|
||||||
|
Painter::colour_file(ins->test_language_setting, ins->test_language_on_setting,
|
||||||
|
matter, coloured);
|
||||||
|
PRINT("Test of colouring for language %S:\n%S\n%S\n",
|
||||||
|
ins->test_language_setting->language_name, matter, coloured);
|
||||||
|
DISCARD_TEXT(matter);
|
||||||
|
DISCARD_TEXT(coloured);
|
||||||
|
} else {
|
||||||
|
Errors::fatal("-test-language and -test-language-on must both be given");
|
||||||
|
}
|
||||||
|
|
||||||
@ But otherwise we do something with the given web:
|
@ But otherwise we do something with the given web:
|
||||||
|
|
||||||
@<Analyse, tangle or weave an existing web@> =
|
@<Analyse, tangle or weave an existing web@> =
|
||||||
|
|
|
@ -25,6 +25,7 @@ typedef struct source_line {
|
||||||
int category; /* what sort of line this is: an |*_LCAT| value */
|
int category; /* what sort of line this is: an |*_LCAT| value */
|
||||||
int command_code; /* used only for |COMMAND_LCAT| lines: a |*_CMD| value */
|
int command_code; /* used only for |COMMAND_LCAT| lines: a |*_CMD| value */
|
||||||
int default_defn; /* used only for |BEGIN_DEFINITION_LCAT| lines */
|
int default_defn; /* used only for |BEGIN_DEFINITION_LCAT| lines */
|
||||||
|
int plainer; /* used only for |BEGIN_CODE_LCAT| lines: suppresses box */
|
||||||
struct programming_language *colour_as; /* used only for |TEXT_EXTRACT_LCAT| lines */
|
struct programming_language *colour_as; /* used only for |TEXT_EXTRACT_LCAT| lines */
|
||||||
int is_commentary; /* flag */
|
int is_commentary; /* flag */
|
||||||
struct function *function_defined; /* if any C-like function is defined on this line */
|
struct function *function_defined; /* if any C-like function is defined on this line */
|
||||||
|
@ -49,6 +50,7 @@ source_line *Lines::new_source_line(text_stream *line, text_file_position *tfp)
|
||||||
sl->category = NO_LCAT; /* that is, unknown category as yet */
|
sl->category = NO_LCAT; /* that is, unknown category as yet */
|
||||||
sl->command_code = NO_CMD;
|
sl->command_code = NO_CMD;
|
||||||
sl->default_defn = FALSE;
|
sl->default_defn = FALSE;
|
||||||
|
sl->plainer = FALSE;
|
||||||
sl->colour_as = NULL;
|
sl->colour_as = NULL;
|
||||||
sl->is_commentary = FALSE;
|
sl->is_commentary = FALSE;
|
||||||
sl->function_defined = NULL;
|
sl->function_defined = NULL;
|
||||||
|
|
|
@ -387,14 +387,29 @@ division in the current section.
|
||||||
code_lcat_for_body = TEXT_EXTRACT_LCAT;
|
code_lcat_for_body = TEXT_EXTRACT_LCAT;
|
||||||
code_pl_for_body = NULL;
|
code_pl_for_body = NULL;
|
||||||
extract_mode = TRUE;
|
extract_mode = TRUE;
|
||||||
} else if ((current_paragraph) && (Regexp::match(&mr2, mr.exp[0], L"%(sample (%c+) code%)"))) {
|
} else if ((current_paragraph) &&
|
||||||
|
(Regexp::match(&mr2, mr.exp[0], L"%(sample (%c+) code%)"))) {
|
||||||
code_lcat_for_body = TEXT_EXTRACT_LCAT;
|
code_lcat_for_body = TEXT_EXTRACT_LCAT;
|
||||||
code_pl_for_body = Languages::find_by_name(mr2.exp[0], W);
|
code_pl_for_body = Languages::find_by_name(mr2.exp[0], W);
|
||||||
extract_mode = TRUE;
|
extract_mode = TRUE;
|
||||||
} else if ((current_paragraph) && (Regexp::match(&mr2, mr.exp[0], L"%(sample code%)"))) {
|
} else if ((current_paragraph) &&
|
||||||
|
(Regexp::match(&mr2, mr.exp[0], L"%(sample code%)"))) {
|
||||||
code_lcat_for_body = TEXT_EXTRACT_LCAT;
|
code_lcat_for_body = TEXT_EXTRACT_LCAT;
|
||||||
code_pl_for_body = S->sect_language;
|
code_pl_for_body = S->sect_language;
|
||||||
extract_mode = TRUE;
|
extract_mode = TRUE;
|
||||||
|
} else if ((current_paragraph) &&
|
||||||
|
(Regexp::match(&mr2, mr.exp[0], L"%(text from (%c+) as (%c+)%)"))) {
|
||||||
|
code_pl_for_body = Languages::find_by_name(mr2.exp[1], W);
|
||||||
|
@<Spool from file@>;
|
||||||
|
} else if ((current_paragraph) &&
|
||||||
|
(Regexp::match(&mr2, mr.exp[0], L"%(text from (%c+)%)"))) {
|
||||||
|
code_pl_for_body = NULL;
|
||||||
|
@<Spool from file@>;
|
||||||
|
} else if ((current_paragraph) &&
|
||||||
|
(Regexp::match(&mr2, mr.exp[0], L"%(undisplayed text from (%c+)%)"))) {
|
||||||
|
code_pl_for_body = NULL;
|
||||||
|
L->plainer = TRUE;
|
||||||
|
@<Spool from file@>;
|
||||||
} else {
|
} else {
|
||||||
Main::error_in_web(I"unknown bracketed annotation", L);
|
Main::error_in_web(I"unknown bracketed annotation", L);
|
||||||
}
|
}
|
||||||
|
@ -405,6 +420,26 @@ division in the current section.
|
||||||
Regexp::dispose_of(&mr2);
|
Regexp::dispose_of(&mr2);
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@<Spool from file@> =
|
||||||
|
L->category = BEGIN_CODE_LCAT;
|
||||||
|
pathname *P = W->md->path_to_web;
|
||||||
|
filename *F = Filenames::from_text_relative(P, mr2.exp[0]);
|
||||||
|
linked_list *lines = Painter::lines(F);
|
||||||
|
text_stream *T;
|
||||||
|
source_line *latest = L;
|
||||||
|
LOOP_OVER_LINKED_LIST(T, text_stream, lines) {
|
||||||
|
source_line *TL = Lines::new_source_line(T, &(L->source));
|
||||||
|
TL->next_line = latest->next_line;
|
||||||
|
TL->plainer = L->plainer;
|
||||||
|
latest->next_line = TL;
|
||||||
|
latest = TL;
|
||||||
|
}
|
||||||
|
source_line *EEL = Lines::new_source_line(I"=", &(L->source));
|
||||||
|
EEL->next_line = latest->next_line;
|
||||||
|
latest->next_line = EEL;
|
||||||
|
code_lcat_for_body = TEXT_EXTRACT_LCAT;
|
||||||
|
extract_mode = TRUE;
|
||||||
|
|
||||||
@ So here we have the possibilities which start with a column-1 |@| sign.
|
@ So here we have the possibilities which start with a column-1 |@| sign.
|
||||||
There appear to be hordes of these, but in fact most of them were removed
|
There appear to be hordes of these, but in fact most of them were removed
|
||||||
in Inweb syntax version 2: in modern syntax, only |@d|, |@e|, |@h|, their
|
in Inweb syntax version 2: in modern syntax, only |@d|, |@e|, |@h|, their
|
||||||
|
|
|
@ -152,6 +152,7 @@ We skip these because we weave their contents in some other way:
|
||||||
if (L->category == END_EXTRACT_LCAT) continue;
|
if (L->category == END_EXTRACT_LCAT) continue;
|
||||||
if (L->category == BEGIN_CODE_LCAT) {
|
if (L->category == BEGIN_CODE_LCAT) {
|
||||||
state->line_break_pending = FALSE;
|
state->line_break_pending = FALSE;
|
||||||
|
LanguageMethods::reset_syntax_colouring(S->sect_language);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -292,25 +293,25 @@ add a vertical skip between them to show the division more clearly.
|
||||||
match_results mr = Regexp::create_mr();
|
match_results mr = Regexp::create_mr();
|
||||||
if (Regexp::match(&mr, matter, L"%(...%) (%c*)")) { /* continue single */
|
if (Regexp::match(&mr, matter, L"%(...%) (%c*)")) { /* continue single */
|
||||||
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
||||||
state->substantive_comment);
|
state->substantive_comment, FALSE);
|
||||||
state->kind_of_material = REGULAR_MATERIAL;
|
state->kind_of_material = REGULAR_MATERIAL;
|
||||||
Formats::item(OUT, wv, 1, I"");
|
Formats::item(OUT, wv, 1, I"");
|
||||||
Str::copy(matter, mr.exp[0]);
|
Str::copy(matter, mr.exp[0]);
|
||||||
} else if (Regexp::match(&mr, matter, L"%(-...%) (%c*)")) { /* continue double */
|
} else if (Regexp::match(&mr, matter, L"%(-...%) (%c*)")) { /* continue double */
|
||||||
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
||||||
state->substantive_comment);
|
state->substantive_comment, FALSE);
|
||||||
state->kind_of_material = REGULAR_MATERIAL;
|
state->kind_of_material = REGULAR_MATERIAL;
|
||||||
Formats::item(OUT, wv, 2, I"");
|
Formats::item(OUT, wv, 2, I"");
|
||||||
Str::copy(matter, mr.exp[0]);
|
Str::copy(matter, mr.exp[0]);
|
||||||
} else if (Regexp::match(&mr, matter, L"%((%i+)%) (%c*)")) { /* begin single */
|
} else if (Regexp::match(&mr, matter, L"%((%i+)%) (%c*)")) { /* begin single */
|
||||||
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
||||||
state->substantive_comment);
|
state->substantive_comment, FALSE);
|
||||||
state->kind_of_material = REGULAR_MATERIAL;
|
state->kind_of_material = REGULAR_MATERIAL;
|
||||||
Formats::item(OUT, wv, 1, mr.exp[0]);
|
Formats::item(OUT, wv, 1, mr.exp[0]);
|
||||||
Str::copy(matter, mr.exp[1]);
|
Str::copy(matter, mr.exp[1]);
|
||||||
} else if (Regexp::match(&mr, matter, L"%(-(%i+)%) (%c*)")) { /* begin double */
|
} else if (Regexp::match(&mr, matter, L"%(-(%i+)%) (%c*)")) { /* begin double */
|
||||||
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
||||||
state->substantive_comment);
|
state->substantive_comment, FALSE);
|
||||||
state->kind_of_material = REGULAR_MATERIAL;
|
state->kind_of_material = REGULAR_MATERIAL;
|
||||||
Formats::item(OUT, wv, 2, mr.exp[0]);
|
Formats::item(OUT, wv, 2, mr.exp[0]);
|
||||||
Str::copy(matter, mr.exp[1]);
|
Str::copy(matter, mr.exp[1]);
|
||||||
|
@ -324,7 +325,8 @@ in the source is set indented in code style.
|
||||||
match_results mr = Regexp::create_mr();
|
match_results mr = Regexp::create_mr();
|
||||||
if (Regexp::match(&mr, matter, L"\t|(%c*)|(%c*?)")) {
|
if (Regexp::match(&mr, matter, L"\t|(%c*)|(%c*?)")) {
|
||||||
if (state->kind_of_material != CODE_MATERIAL) {
|
if (state->kind_of_material != CODE_MATERIAL) {
|
||||||
Formats::change_material(OUT, wv, state->kind_of_material, CODE_MATERIAL, TRUE);
|
Formats::change_material(OUT, wv, state->kind_of_material, CODE_MATERIAL,
|
||||||
|
TRUE, L->plainer);
|
||||||
state->kind_of_material = CODE_MATERIAL;
|
state->kind_of_material = CODE_MATERIAL;
|
||||||
}
|
}
|
||||||
TEMPORARY_TEXT(original);
|
TEMPORARY_TEXT(original);
|
||||||
|
@ -338,7 +340,8 @@ in the source is set indented in code style.
|
||||||
DISCARD_TEXT(original);
|
DISCARD_TEXT(original);
|
||||||
continue;
|
continue;
|
||||||
} else if (state->kind_of_material != REGULAR_MATERIAL) {
|
} else if (state->kind_of_material != REGULAR_MATERIAL) {
|
||||||
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL, TRUE);
|
Formats::change_material(OUT, wv, state->kind_of_material, REGULAR_MATERIAL,
|
||||||
|
TRUE, FALSE);
|
||||||
state->kind_of_material = REGULAR_MATERIAL;
|
state->kind_of_material = REGULAR_MATERIAL;
|
||||||
}
|
}
|
||||||
Regexp::dispose_of(&mr);
|
Regexp::dispose_of(&mr);
|
||||||
|
@ -364,7 +367,8 @@ and macro usage is rendered differently.
|
||||||
W, C, S, L, matter, concluding_comment)) continue;
|
W, C, S, L, matter, concluding_comment)) continue;
|
||||||
|
|
||||||
TEMPORARY_TEXT(colouring);
|
TEMPORARY_TEXT(colouring);
|
||||||
LanguageMethods::syntax_colour(OUT, S->sect_language, wv, W, C, S, L, matter, colouring);
|
LanguageMethods::syntax_colour(OUT, S->sect_language, wv, W, C, S, L,
|
||||||
|
matter, colouring);
|
||||||
|
|
||||||
int found = 0;
|
int found = 0;
|
||||||
@<Find macro usages and adjust syntax colouring accordingly@>;
|
@<Find macro usages and adjust syntax colouring accordingly@>;
|
||||||
|
@ -399,7 +403,7 @@ hence the name of the following paragraph:
|
||||||
else
|
else
|
||||||
state->kind_of_material = CODE_MATERIAL;
|
state->kind_of_material = CODE_MATERIAL;
|
||||||
Formats::change_material(OUT, wv, mode_now, state->kind_of_material,
|
Formats::change_material(OUT, wv, mode_now, state->kind_of_material,
|
||||||
state->substantive_comment);
|
state->substantive_comment, L->plainer);
|
||||||
state->line_break_pending = FALSE;
|
state->line_break_pending = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -501,7 +505,7 @@ otherwise, they are set flush right.
|
||||||
@<Complete any started but not-fully-woven paragraph@>;
|
@<Complete any started but not-fully-woven paragraph@>;
|
||||||
if (wv->theme_match)
|
if (wv->theme_match)
|
||||||
@<If this is a paragraph break forced onto a new page, then throw a page@>;
|
@<If this is a paragraph break forced onto a new page, then throw a page@>;
|
||||||
LanguageMethods::reset_syntax_colouring(S->sect_language); /* a precaution: limits bad colouring accidents to one para */
|
LanguageMethods::reset_syntax_colouring(S->sect_language);
|
||||||
int weight = 0;
|
int weight = 0;
|
||||||
if (L->category == HEADING_START_LCAT) weight = 1;
|
if (L->category == HEADING_START_LCAT) weight = 1;
|
||||||
if (L->category == SECTION_HEADING_LCAT) weight = 2;
|
if (L->category == SECTION_HEADING_LCAT) weight = 2;
|
||||||
|
@ -647,7 +651,8 @@ At the end of a paragraph, on the other hand, we do this:
|
||||||
int mode_now = state->kind_of_material;
|
int mode_now = state->kind_of_material;
|
||||||
if (state->kind_of_material != REGULAR_MATERIAL) {
|
if (state->kind_of_material != REGULAR_MATERIAL) {
|
||||||
state->kind_of_material = REGULAR_MATERIAL;
|
state->kind_of_material = REGULAR_MATERIAL;
|
||||||
Formats::change_material(OUT, wv, mode_now, state->kind_of_material, TRUE);
|
Formats::change_material(OUT, wv, mode_now, state->kind_of_material,
|
||||||
|
TRUE, L?(L->plainer):FALSE);
|
||||||
}
|
}
|
||||||
if ((current_paragraph) && (current_paragraph != state->last_endnoted_para)) {
|
if ((current_paragraph) && (current_paragraph != state->last_endnoted_para)) {
|
||||||
state->last_endnoted_para = current_paragraph;
|
state->last_endnoted_para = current_paragraph;
|
||||||
|
|
|
@ -245,5 +245,5 @@ int ACMESupport::syntax_colour(programming_language *pl, text_stream *OUT, weave
|
||||||
hash_table *ht = &(S->sect_target->symbols);
|
hash_table *ht = &(S->sect_target->symbols);
|
||||||
if ((L->category == TEXT_EXTRACT_LCAT) && (pl != S->sect_language))
|
if ((L->category == TEXT_EXTRACT_LCAT) && (pl != S->sect_language))
|
||||||
ht = &(pl->built_in_keywords);
|
ht = &(pl->built_in_keywords);
|
||||||
return Painter::syntax_colour(pl, OUT, ht, matter, colouring, FALSE);
|
return Painter::syntax_colour(pl, ht, matter, colouring, FALSE);
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,7 +25,7 @@ programming_language *Languages::find_by_name(text_stream *lname, web *W) {
|
||||||
@<Read the language definition file with this name@> =
|
@<Read the language definition file with this name@> =
|
||||||
filename *F = NULL;
|
filename *F = NULL;
|
||||||
if (W) {
|
if (W) {
|
||||||
pathname *P = Pathnames::subfolder(W->md->path_to_web, I"Private Languages");
|
pathname *P = Pathnames::subfolder(W->md->path_to_web, I"Dialects");
|
||||||
@<Try P@>;
|
@<Try P@>;
|
||||||
}
|
}
|
||||||
pathname *P = Languages::default_directory();
|
pathname *P = Languages::default_directory();
|
||||||
|
@ -415,6 +415,7 @@ typedef struct colouring_rule {
|
||||||
int match_prefix; /* one of the |*_RULE_PREFIX| values above */
|
int match_prefix; /* one of the |*_RULE_PREFIX| values above */
|
||||||
wchar_t match_regexp_text[MAX_ILDF_REGEXP_LENGTH];
|
wchar_t match_regexp_text[MAX_ILDF_REGEXP_LENGTH];
|
||||||
int number; /* for |number N| rules; 0 for others */
|
int number; /* for |number N| rules; 0 for others */
|
||||||
|
int number_of; /* for |number N of M| rules; 0 for others */
|
||||||
|
|
||||||
/* the conclusion: */
|
/* the conclusion: */
|
||||||
struct colouring_language_block *execute_block; /* or |NULL|, in which case... */
|
struct colouring_language_block *execute_block; /* or |NULL|, in which case... */
|
||||||
|
@ -440,6 +441,7 @@ colouring_rule *Languages::new_rule(colouring_language_block *within) {
|
||||||
rule->match_keyword_of_colour = NOT_A_COLOUR;
|
rule->match_keyword_of_colour = NOT_A_COLOUR;
|
||||||
rule->match_regexp_text[0] = 0;
|
rule->match_regexp_text[0] = 0;
|
||||||
rule->number = 0;
|
rule->number = 0;
|
||||||
|
rule->number_of = 0;
|
||||||
|
|
||||||
rule->set_to_colour = NOT_A_COLOUR;
|
rule->set_to_colour = NOT_A_COLOUR;
|
||||||
rule->set_prefix_to_colour = NOT_A_COLOUR;
|
rule->set_prefix_to_colour = NOT_A_COLOUR;
|
||||||
|
@ -469,6 +471,9 @@ void Languages::parse_rule(language_reader_state *state, text_stream *premiss,
|
||||||
}
|
}
|
||||||
if (Regexp::match(&mr, premiss, L"number (%d+)")) {
|
if (Regexp::match(&mr, premiss, L"number (%d+)")) {
|
||||||
rule->number = Str::atoi(mr.exp[0], 0);
|
rule->number = Str::atoi(mr.exp[0], 0);
|
||||||
|
} else if (Regexp::match(&mr, premiss, L"number (%d+) of (%d+)")) {
|
||||||
|
rule->number = Str::atoi(mr.exp[0], 0);
|
||||||
|
rule->number_of = Str::atoi(mr.exp[1], 0);
|
||||||
} else if (Regexp::match(&mr, premiss, L"keyword of (%c+)")) {
|
} else if (Regexp::match(&mr, premiss, L"keyword of (%c+)")) {
|
||||||
rule->match_keyword_of_colour = Languages::colour(mr.exp[0], tfp);
|
rule->match_keyword_of_colour = Languages::colour(mr.exp[0], tfp);
|
||||||
} else if (Regexp::match(&mr, premiss, L"keyword")) {
|
} else if (Regexp::match(&mr, premiss, L"keyword")) {
|
||||||
|
@ -560,6 +565,7 @@ but which are not expressible in the syntax of this file.
|
||||||
@d PLAIN_COLOUR 'p'
|
@d PLAIN_COLOUR 'p'
|
||||||
@d EXTRACT_COLOUR 'x'
|
@d EXTRACT_COLOUR 'x'
|
||||||
@d COMMENT_COLOUR '!'
|
@d COMMENT_COLOUR '!'
|
||||||
|
@d NEWLINE_COLOUR '\n'
|
||||||
|
|
||||||
@d NOT_A_COLOUR ' '
|
@d NOT_A_COLOUR ' '
|
||||||
@d UNQUOTED_COLOUR '_'
|
@d UNQUOTED_COLOUR '_'
|
||||||
|
|
|
@ -13,8 +13,10 @@ Because of that, we need to call the following before we begin a run of calls
|
||||||
to |Painter::syntax_colour|:
|
to |Painter::syntax_colour|:
|
||||||
|
|
||||||
=
|
=
|
||||||
|
int painter_count = 1;
|
||||||
void Painter::reset_syntax_colouring(programming_language *pl) {
|
void Painter::reset_syntax_colouring(programming_language *pl) {
|
||||||
colouring_state = PLAIN_COLOUR;
|
colouring_state = PLAIN_COLOUR;
|
||||||
|
painter_count = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ As we begin, the text to colour is in |matter|, while |colouring| is an
|
@ As we begin, the text to colour is in |matter|, while |colouring| is an
|
||||||
|
@ -33,7 +35,7 @@ We get to that by using a language's rules on literals, and then executing
|
||||||
its colouring program.
|
its colouring program.
|
||||||
|
|
||||||
=
|
=
|
||||||
int Painter::syntax_colour(programming_language *pl, text_stream *OUT,
|
int Painter::syntax_colour(programming_language *pl,
|
||||||
hash_table *HT, text_stream *matter, text_stream *colouring, int with_comments) {
|
hash_table *HT, text_stream *matter, text_stream *colouring, int with_comments) {
|
||||||
int from = 0, to = Str::len(matter) - 1;
|
int from = 0, to = Str::len(matter) - 1;
|
||||||
if (with_comments) {
|
if (with_comments) {
|
||||||
|
@ -49,11 +51,11 @@ int Painter::syntax_colour(programming_language *pl, text_stream *OUT,
|
||||||
DISCARD_TEXT(part_before_comment);
|
DISCARD_TEXT(part_before_comment);
|
||||||
DISCARD_TEXT(part_within_comment);
|
DISCARD_TEXT(part_within_comment);
|
||||||
}
|
}
|
||||||
Painter::syntax_colour_inner(pl, OUT, HT, matter, colouring, from, to);
|
Painter::syntax_colour_inner(pl, HT, matter, colouring, from, to);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Painter::syntax_colour_inner(programming_language *pl, text_stream *OUT,
|
void Painter::syntax_colour_inner(programming_language *pl,
|
||||||
hash_table *HT, text_stream *matter, text_stream *colouring, int from, int to) {
|
hash_table *HT, text_stream *matter, text_stream *colouring, int from, int to) {
|
||||||
@<Spot identifiers, literal text and character constants@>;
|
@<Spot identifiers, literal text and character constants@>;
|
||||||
@<Spot literal numerical constants@>;
|
@<Spot literal numerical constants@>;
|
||||||
|
@ -190,7 +192,7 @@ takes over.
|
||||||
|
|
||||||
@<Now run the colouring program@> =
|
@<Now run the colouring program@> =
|
||||||
if (pl->program)
|
if (pl->program)
|
||||||
Painter::execute(HT, pl->program, matter, colouring, from, to);
|
Painter::execute(HT, pl->program, matter, colouring, from, to, painter_count++);
|
||||||
|
|
||||||
@ The run-type for a block determines what the rules in it apply to: the
|
@ The run-type for a block determines what the rules in it apply to: the
|
||||||
whole snippet of text, or each character on its own, or each run of characters
|
whole snippet of text, or each character on its own, or each run of characters
|
||||||
|
@ -199,7 +201,7 @@ rule across the whole snippet before moving on to the next.
|
||||||
|
|
||||||
=
|
=
|
||||||
void Painter::execute(hash_table *HT, colouring_language_block *block, text_stream *matter,
|
void Painter::execute(hash_table *HT, colouring_language_block *block, text_stream *matter,
|
||||||
text_stream *colouring, int from, int to) {
|
text_stream *colouring, int from, int to, int N) {
|
||||||
if (block == NULL) internal_error("no block");
|
if (block == NULL) internal_error("no block");
|
||||||
TEMPORARY_TEXT(colouring_at_start);
|
TEMPORARY_TEXT(colouring_at_start);
|
||||||
Str::copy(colouring_at_start, colouring);
|
Str::copy(colouring_at_start, colouring);
|
||||||
|
@ -207,7 +209,8 @@ void Painter::execute(hash_table *HT, colouring_language_block *block, text_stre
|
||||||
LOOP_OVER_LINKED_LIST(rule, colouring_rule, block->rules) {
|
LOOP_OVER_LINKED_LIST(rule, colouring_rule, block->rules) {
|
||||||
switch (block->run) {
|
switch (block->run) {
|
||||||
case WHOLE_LINE_CRULE_RUN:
|
case WHOLE_LINE_CRULE_RUN:
|
||||||
Painter::execute_rule(HT, rule, matter, colouring, from, to, 1);
|
Painter::execute_rule(HT, rule, matter, colouring, from, to,
|
||||||
|
(N == 0)?1:N);
|
||||||
break;
|
break;
|
||||||
case CHARACTERS_CRULE_RUN:
|
case CHARACTERS_CRULE_RUN:
|
||||||
for (int i=from; i<=to; i++)
|
for (int i=from; i<=to; i++)
|
||||||
|
@ -298,7 +301,11 @@ void Painter::execute_rule(hash_table *HT, colouring_rule *rule, text_stream *ma
|
||||||
int Painter::satisfies(hash_table *HT, colouring_rule *rule, text_stream *matter,
|
int Painter::satisfies(hash_table *HT, colouring_rule *rule, text_stream *matter,
|
||||||
text_stream *colouring, int from, int to, int N) {
|
text_stream *colouring, int from, int to, int N) {
|
||||||
if (rule->number > 0) {
|
if (rule->number > 0) {
|
||||||
if (rule->number != N) return FALSE;
|
if (rule->number_of > 0) {
|
||||||
|
if (rule->number != ((N-1)%(rule->number_of)) + 1) return FALSE;
|
||||||
|
} else {
|
||||||
|
if (rule->number != N) return FALSE;
|
||||||
|
}
|
||||||
} else if (rule->match_regexp_text[0]) {
|
} else if (rule->match_regexp_text[0]) {
|
||||||
if (Regexp::match(&(rule->mr), matter, rule->match_regexp_text) == FALSE)
|
if (Regexp::match(&(rule->mr), matter, rule->match_regexp_text) == FALSE)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
@ -355,7 +362,7 @@ int Painter::satisfies(hash_table *HT, colouring_rule *rule, text_stream *matter
|
||||||
void Painter::follow(hash_table *HT, colouring_rule *rule, text_stream *matter,
|
void Painter::follow(hash_table *HT, colouring_rule *rule, text_stream *matter,
|
||||||
text_stream *colouring, int from, int to) {
|
text_stream *colouring, int from, int to) {
|
||||||
if (rule->execute_block)
|
if (rule->execute_block)
|
||||||
Painter::execute(HT, rule->execute_block, matter, colouring, from, to);
|
Painter::execute(HT, rule->execute_block, matter, colouring, from, to, 0);
|
||||||
else if (rule->debug) @<Print some debugging text@>
|
else if (rule->debug) @<Print some debugging text@>
|
||||||
else {
|
else {
|
||||||
if (rule->set_to_colour != NOT_A_COLOUR)
|
if (rule->set_to_colour != NOT_A_COLOUR)
|
||||||
|
@ -375,3 +382,60 @@ void Painter::follow(hash_table *HT, colouring_rule *rule, text_stream *matter,
|
||||||
for (int i=from; i<=to; i++)
|
for (int i=from; i<=to; i++)
|
||||||
PUT_TO(STDOUT, Str::get_at(colouring, i));
|
PUT_TO(STDOUT, Str::get_at(colouring, i));
|
||||||
PRINT("\n");
|
PRINT("\n");
|
||||||
|
|
||||||
|
@h Painting a file.
|
||||||
|
|
||||||
|
=
|
||||||
|
linked_list *Painter::lines(filename *F) {
|
||||||
|
linked_list *L = NEW_LINKED_LIST(text_stream);
|
||||||
|
TextFiles::read(F, FALSE, "unable to read file of textual extract", TRUE,
|
||||||
|
&Painter::text_file_helper, NULL, L);
|
||||||
|
int n = -1, c = 0;
|
||||||
|
text_stream *T;
|
||||||
|
LOOP_OVER_LINKED_LIST(T, text_stream, L) {
|
||||||
|
c++;
|
||||||
|
if (Str::is_whitespace(T) == FALSE)
|
||||||
|
n = c;
|
||||||
|
}
|
||||||
|
if (n >= 0) {
|
||||||
|
linked_list *R = NEW_LINKED_LIST(text_stream);
|
||||||
|
c = 0;
|
||||||
|
LOOP_OVER_LINKED_LIST(T, text_stream, L)
|
||||||
|
if (++c <= n)
|
||||||
|
ADD_TO_LINKED_LIST(T, text_stream, R);
|
||||||
|
return R;
|
||||||
|
}
|
||||||
|
return L;
|
||||||
|
}
|
||||||
|
|
||||||
|
void Painter::text_file_helper(text_stream *text, text_file_position *tfp, void *state) {
|
||||||
|
linked_list *L = (linked_list *) state;
|
||||||
|
ADD_TO_LINKED_LIST(Str::duplicate(text), text_stream, L);
|
||||||
|
}
|
||||||
|
|
||||||
|
void Painter::colour_file(programming_language *pl, filename *F, text_stream *to, text_stream *coloured) {
|
||||||
|
linked_list *L = Painter::lines(F);
|
||||||
|
if (pl) Painter::reset_syntax_colouring(pl);
|
||||||
|
int c = 1;
|
||||||
|
text_stream *T;
|
||||||
|
LOOP_OVER_LINKED_LIST(T, text_stream, L) {
|
||||||
|
if (c++ > 1) { PUT_TO(to, '\n'); PUT_TO(coloured, NEWLINE_COLOUR); }
|
||||||
|
Str::trim_white_space_at_end(T);
|
||||||
|
TEMPORARY_TEXT(ST);
|
||||||
|
TEMPORARY_TEXT(SC);
|
||||||
|
LOOP_THROUGH_TEXT(pos, T)
|
||||||
|
if (Str::get(pos) == '\t')
|
||||||
|
WRITE_TO(ST, " ");
|
||||||
|
else
|
||||||
|
PUT_TO(ST, Str::get(pos));
|
||||||
|
if (pl) {
|
||||||
|
Painter::syntax_colour(pl, (pl)?(&(pl->built_in_keywords)):NULL, ST, SC, TRUE);
|
||||||
|
} else {
|
||||||
|
LOOP_THROUGH_TEXT(pos, ST)
|
||||||
|
PUT_TO(SC, PLAIN_COLOUR);
|
||||||
|
}
|
||||||
|
WRITE_TO(to, "%S", ST);
|
||||||
|
WRITE_TO(coloured, "%S", SC);
|
||||||
|
}
|
||||||
|
if (c > 0) { PUT_TO(to, '\n'); PUT_TO(coloured, NEWLINE_COLOUR); }
|
||||||
|
}
|
||||||
|
|
|
@ -374,13 +374,6 @@ void HTMLFormat::bar(weave_format *self, text_stream *OUT, weave_target *wv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ =
|
@ =
|
||||||
typedef struct HTML_figure_state {
|
|
||||||
struct text_stream *OUT;
|
|
||||||
struct programming_language *colour_as;
|
|
||||||
struct weave_target *wv;
|
|
||||||
struct hash_table *keywords;
|
|
||||||
} HTML_figure_state;
|
|
||||||
|
|
||||||
void HTMLFormat::figure(weave_format *self, text_stream *OUT, weave_target *wv,
|
void HTMLFormat::figure(weave_format *self, text_stream *OUT, weave_target *wv,
|
||||||
text_stream *figname, int w, int h, programming_language *pl) {
|
text_stream *figname, int w, int h, programming_language *pl) {
|
||||||
HTMLFormat::exit_current_paragraph(OUT);
|
HTMLFormat::exit_current_paragraph(OUT);
|
||||||
|
@ -388,44 +381,13 @@ void HTMLFormat::figure(weave_format *self, text_stream *OUT, weave_target *wv,
|
||||||
Pathnames::subfolder(wv->weave_web->md->path_to_web, I"Figures"),
|
Pathnames::subfolder(wv->weave_web->md->path_to_web, I"Figures"),
|
||||||
figname);
|
figname);
|
||||||
filename *RF = Filenames::from_text(figname);
|
filename *RF = Filenames::from_text(figname);
|
||||||
TEMPORARY_TEXT(ext);
|
HTML_OPEN("center");
|
||||||
Filenames::write_extension(ext, RF);
|
HTML::image(OUT, RF);
|
||||||
if ((pl) || (Str::eq_insensitive(ext, I".txt"))) {
|
Patterns::copy_file_into_weave(wv->weave_web, F);
|
||||||
if (pl == NULL) HTMLFormat::pre(OUT, NULL);
|
HTML_CLOSE("center");
|
||||||
else HTMLFormat::pre(OUT, "display");
|
|
||||||
if (pl) Painter::reset_syntax_colouring(pl);
|
|
||||||
HTML_figure_state hfs;
|
|
||||||
hfs.OUT = OUT;
|
|
||||||
hfs.colour_as = pl;
|
|
||||||
hfs.wv = wv;
|
|
||||||
hfs.keywords = (pl)?(&(pl->built_in_keywords)):NULL;
|
|
||||||
TextFiles::read(F, FALSE, "unable to read file of textual figure", TRUE,
|
|
||||||
&HTMLFormat::text_file_helper, NULL, &hfs);
|
|
||||||
if (pl == NULL) HTMLFormat::cpre(OUT);
|
|
||||||
else HTMLFormat::cpre(OUT);
|
|
||||||
} else {
|
|
||||||
HTML_OPEN("center");
|
|
||||||
HTML::image(OUT, RF);
|
|
||||||
Patterns::copy_file_into_weave(wv->weave_web, F);
|
|
||||||
HTML_CLOSE("center");
|
|
||||||
}
|
|
||||||
DISCARD_TEXT(ext);
|
|
||||||
WRITE("\n");
|
WRITE("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
void HTMLFormat::text_file_helper(text_stream *text, text_file_position *tfp, void *state) {
|
|
||||||
HTML_figure_state *hfs = (HTML_figure_state *) state;
|
|
||||||
TEMPORARY_TEXT(colouring);
|
|
||||||
LOOP_THROUGH_TEXT(pos, text) PUT_TO(colouring, PLAIN_COLOUR);
|
|
||||||
if (hfs->colour_as) {
|
|
||||||
Painter::syntax_colour(hfs->colour_as, hfs->OUT, hfs->keywords, text, colouring, TRUE);
|
|
||||||
Formats::source_code(hfs->OUT, hfs->wv, 0, I"", text, colouring, I"", TRUE, TRUE, TRUE);
|
|
||||||
} else {
|
|
||||||
WRITE_TO(hfs->OUT, "%S\n", text);
|
|
||||||
}
|
|
||||||
DISCARD_TEXT(colouring);
|
|
||||||
}
|
|
||||||
|
|
||||||
@ =
|
@ =
|
||||||
void HTMLFormat::para_macro(weave_format *self, text_stream *OUT, weave_target *wv,
|
void HTMLFormat::para_macro(weave_format *self, text_stream *OUT, weave_target *wv,
|
||||||
para_macro *pmac, int defn) {
|
para_macro *pmac, int defn) {
|
||||||
|
@ -461,7 +423,7 @@ void HTMLFormat::blank_line(weave_format *self, text_stream *OUT, weave_target *
|
||||||
|
|
||||||
@ =
|
@ =
|
||||||
void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_target *wv,
|
void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_target *wv,
|
||||||
int old_material, int new_material, int content) {
|
int old_material, int new_material, int content, int plainly) {
|
||||||
if (old_material != new_material) {
|
if (old_material != new_material) {
|
||||||
if (old_material == MACRO_MATERIAL) HTML_CLOSE("code");
|
if (old_material == MACRO_MATERIAL) HTML_CLOSE("code");
|
||||||
if ((content) || (new_material != MACRO_MATERIAL))
|
if ((content) || (new_material != MACRO_MATERIAL))
|
||||||
|
@ -471,8 +433,8 @@ void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_tar
|
||||||
case REGULAR_MATERIAL:
|
case REGULAR_MATERIAL:
|
||||||
switch (new_material) {
|
switch (new_material) {
|
||||||
case CODE_MATERIAL:
|
case CODE_MATERIAL:
|
||||||
WRITE("\n");
|
if (plainly) HTMLFormat::pre(OUT, NULL);
|
||||||
HTMLFormat::pre(OUT, "display");
|
else HTMLFormat::pre(OUT, "display");
|
||||||
break;
|
break;
|
||||||
case DEFINITION_MATERIAL:
|
case DEFINITION_MATERIAL:
|
||||||
WRITE("\n");
|
WRITE("\n");
|
||||||
|
@ -510,7 +472,8 @@ void HTMLFormat::change_material(weave_format *self, text_stream *OUT, weave_tar
|
||||||
switch (new_material) {
|
switch (new_material) {
|
||||||
case CODE_MATERIAL:
|
case CODE_MATERIAL:
|
||||||
WRITE("\n");
|
WRITE("\n");
|
||||||
HTMLFormat::pre(OUT, "display");
|
if (plainly) HTMLFormat::pre(OUT, NULL);
|
||||||
|
else HTMLFormat::pre(OUT, "display");
|
||||||
break;
|
break;
|
||||||
case MACRO_MATERIAL:
|
case MACRO_MATERIAL:
|
||||||
WRITE("\n");
|
WRITE("\n");
|
||||||
|
|
|
@ -379,7 +379,7 @@ void TeX::locale(weave_format *self, text_stream *OUT, weave_target *wv,
|
||||||
|
|
||||||
@ =
|
@ =
|
||||||
void TeX::change_material(weave_format *self, text_stream *OUT, weave_target *wv,
|
void TeX::change_material(weave_format *self, text_stream *OUT, weave_target *wv,
|
||||||
int old_material, int new_material, int content) {
|
int old_material, int new_material, int content, int change_material) {
|
||||||
if (old_material != new_material) {
|
if (old_material != new_material) {
|
||||||
switch (old_material) {
|
switch (old_material) {
|
||||||
case REGULAR_MATERIAL:
|
case REGULAR_MATERIAL:
|
||||||
|
|
|
@ -340,11 +340,12 @@ weaver and turned into something else (such as list items).
|
||||||
|
|
||||||
=
|
=
|
||||||
VMETHOD_TYPE(CHANGE_MATERIAL_FOR_MTID, weave_format *wf, text_stream *OUT,
|
VMETHOD_TYPE(CHANGE_MATERIAL_FOR_MTID, weave_format *wf, text_stream *OUT,
|
||||||
weave_target *wv, int old_material, int new_material, int content)
|
weave_target *wv, int old_material, int new_material, int content, int plainly)
|
||||||
void Formats::change_material(OUTPUT_STREAM, weave_target *wv,
|
void Formats::change_material(OUTPUT_STREAM, weave_target *wv,
|
||||||
int old_material, int new_material, int content) {
|
int old_material, int new_material, int content, int plainly) {
|
||||||
weave_format *wf = wv->format;
|
weave_format *wf = wv->format;
|
||||||
VMETHOD_CALL(wf, CHANGE_MATERIAL_FOR_MTID, OUT, wv, old_material, new_material, content);
|
VMETHOD_CALL(wf, CHANGE_MATERIAL_FOR_MTID, OUT, wv, old_material, new_material,
|
||||||
|
content, plainly);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ This is called on a change of colour. "Colour" is really a shorthand way
|
@ This is called on a change of colour. "Colour" is really a shorthand way
|
||||||
|
|
19
Dialects/PainterOutput.ildf
Normal file
19
Dialects/PainterOutput.ildf
Normal 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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -22,6 +22,8 @@ for locating programming language definitions:
|
||||||
-read-language X read language definition from file X
|
-read-language X read language definition from file X
|
||||||
-read-languages X read all language definitions in path X
|
-read-languages X read all language definitions in path X
|
||||||
-show-languages list programming languages supported by Inweb
|
-show-languages list programming languages supported by Inweb
|
||||||
|
-test-language X test language X on...
|
||||||
|
-test-language-on X ...the code in the file X
|
||||||
|
|
||||||
for analysing a web:
|
for analysing a web:
|
||||||
-advance-build increment daily build code for the web
|
-advance-build increment daily build code for the web
|
||||||
|
|
|
@ -14,8 +14,8 @@ colouring {
|
||||||
runs of unquoted {
|
runs of unquoted {
|
||||||
runs of !identifier {
|
runs of !identifier {
|
||||||
=> !reserved
|
=> !reserved
|
||||||
prefix . => !identifier on both
|
prefix "." => !identifier on both
|
||||||
prefix ! => !element on both
|
prefix "!" => !element on both
|
||||||
}
|
}
|
||||||
characters {
|
characters {
|
||||||
+ => !identifier
|
+ => !identifier
|
||||||
|
|
|
@ -2,7 +2,6 @@ Name: "ILDF"
|
||||||
Details: "The Inweb Language Definition File format"
|
Details: "The Inweb Language Definition File format"
|
||||||
Extension: ".ildf"
|
Extension: ".ildf"
|
||||||
Whole Line Comment: "#"
|
Whole Line Comment: "#"
|
||||||
Supports Namespaces: false
|
|
||||||
|
|
||||||
String Literal: "\""
|
String Literal: "\""
|
||||||
String Literal Escape: "\\"
|
String Literal Escape: "\\"
|
||||||
|
|
|
@ -20,62 +20,62 @@ End Ifndef: "#endif; ! %S\n"
|
||||||
|
|
||||||
# Reserved words:
|
# Reserved words:
|
||||||
|
|
||||||
keyword Constant
|
keyword "Constant"
|
||||||
keyword Array
|
keyword "Array"
|
||||||
|
|
||||||
keyword box
|
keyword "box"
|
||||||
keyword break
|
keyword "break"
|
||||||
keyword child
|
keyword "child"
|
||||||
keyword children
|
keyword "children"
|
||||||
keyword continue
|
keyword "continue"
|
||||||
keyword default
|
keyword "default"
|
||||||
keyword do
|
keyword "do"
|
||||||
keyword elder
|
keyword "elder"
|
||||||
keyword eldest
|
keyword "eldest"
|
||||||
keyword else
|
keyword "else"
|
||||||
keyword false
|
keyword "false"
|
||||||
keyword font
|
keyword "font"
|
||||||
keyword for
|
keyword "for"
|
||||||
keyword give
|
keyword "give"
|
||||||
keyword has
|
keyword "has"
|
||||||
keyword hasnt
|
keyword "hasnt"
|
||||||
keyword if
|
keyword "if"
|
||||||
keyword in
|
keyword "in"
|
||||||
keyword indirect
|
keyword "indirect"
|
||||||
keyword inversion
|
keyword "inversion"
|
||||||
keyword jump
|
keyword "jump"
|
||||||
keyword metaclass
|
keyword "metaclass"
|
||||||
keyword move
|
keyword "move"
|
||||||
keyword new_line
|
keyword "new_line"
|
||||||
keyword nothing
|
keyword "nothing"
|
||||||
keyword notin
|
keyword "notin"
|
||||||
keyword objectloop
|
keyword "objectloop"
|
||||||
keyword ofclass
|
keyword "ofclass"
|
||||||
keyword or
|
keyword "or"
|
||||||
keyword parent
|
keyword "parent"
|
||||||
keyword print
|
keyword "print"
|
||||||
keyword print_ret
|
keyword "print_ret"
|
||||||
keyword provides
|
keyword "provides"
|
||||||
keyword quit
|
keyword "quit"
|
||||||
keyword random
|
keyword "random"
|
||||||
keyword read
|
keyword "read"
|
||||||
keyword remove
|
keyword "remove"
|
||||||
keyword restore
|
keyword "restore"
|
||||||
keyword return
|
keyword "return"
|
||||||
keyword rfalse
|
keyword "rfalse"
|
||||||
keyword rtrue
|
keyword "rtrue"
|
||||||
keyword save
|
keyword "save"
|
||||||
keyword sibling
|
keyword "sibling"
|
||||||
keyword spaces
|
keyword "spaces"
|
||||||
keyword string
|
keyword "string"
|
||||||
keyword style
|
keyword "style"
|
||||||
keyword switch
|
keyword "switch"
|
||||||
keyword to
|
keyword "to"
|
||||||
keyword true
|
keyword "true"
|
||||||
keyword until
|
keyword "until"
|
||||||
keyword while
|
keyword "while"
|
||||||
keyword younger
|
keyword "younger"
|
||||||
keyword youngest
|
keyword "youngest"
|
||||||
|
|
||||||
colouring {
|
colouring {
|
||||||
runs of unquoted {
|
runs of unquoted {
|
||||||
|
|
|
@ -4,13 +4,13 @@ The current help information as it would be printed at the command line.
|
||||||
|
|
||||||
@ Running Inweb with |-help| currently produces the following summary:
|
@ Running Inweb with |-help| currently produces the following summary:
|
||||||
|
|
||||||
[[help.txt]]
|
= (undisplayed text from Figures/help.txt)
|
||||||
|
|
||||||
@ Running Inweb with |-show-languages| currently produces the following list
|
@ Running Inweb with |-show-languages| currently produces the following list
|
||||||
of programming languages for which support is provided in the standard
|
of programming languages for which support is provided in the standard
|
||||||
distribution:
|
distribution:
|
||||||
|
|
||||||
[[languages.txt]]
|
= (undisplayed text from Figures/languages.txt)
|
||||||
|
|
||||||
It's easy to make new language definitions, and contributions of these are
|
It's easy to make new language definitions, and contributions of these are
|
||||||
welcome.
|
welcome.
|
||||||
|
|
|
@ -9,6 +9,7 @@ is woven, it will look much nicer with syntax-colouring, and that clearly
|
||||||
can't be done without at least a surface understanding of what programs in
|
can't be done without at least a surface understanding of what programs in
|
||||||
the language mean.
|
the language mean.
|
||||||
|
|
||||||
|
@
|
||||||
As we've seen, the Contents section of a web has to specify its language.
|
As we've seen, the Contents section of a web has to specify its language.
|
||||||
For example,
|
For example,
|
||||||
|
|
||||||
|
@ -22,7 +23,7 @@ then its file is |L.ildf|. You can see the languages currently available
|
||||||
to Inweb by using |-show-languages|. At present, a newly installed Inweb
|
to Inweb by using |-show-languages|. At present, a newly installed Inweb
|
||||||
replies like so:
|
replies like so:
|
||||||
|
|
||||||
[[languages.txt]]
|
= (undisplayed text from Figures/languages.txt)
|
||||||
|
|
||||||
@ So what if you want to write a literate program in a language not on that
|
@ So what if you want to write a literate program in a language not on that
|
||||||
list? One option is to give the language as |None|. (Note that this is
|
list? One option is to give the language as |None|. (Note that this is
|
||||||
|
@ -48,7 +49,14 @@ Once you have written a definition, use |-read-language L| at the command
|
||||||
line, where |L| is the file defining it. If you have many custom languages,
|
line, where |L| is the file defining it. If you have many custom languages,
|
||||||
|-read-languages D| reads all of the definitions in a directory |D|. Or, if
|
|-read-languages D| reads all of the definitions in a directory |D|. Or, if
|
||||||
the language in question is really quite specific to a single web, you can
|
the language in question is really quite specific to a single web, you can
|
||||||
make a |Private Languages| subdirectory of the web and put it in there.
|
make a |Dialects| subdirectory of the web and put it in there. (A dialect is,
|
||||||
|
after all, a local language.)
|
||||||
|
|
||||||
|
For testing purposes, running with |-test-language F -test-language-on G|
|
||||||
|
reads in a file |G| of code, and syntax-colours it according to the rules
|
||||||
|
for the language defined in the file |F|, then prints a plain-text diagram
|
||||||
|
of the results. (This can then be tested with Intest test cases, as indeed
|
||||||
|
Inweb does itself.)
|
||||||
|
|
||||||
@h Structure of language definitions.
|
@h Structure of language definitions.
|
||||||
Each language is defined by a single ILDF file. ("Inweb Language Definition
|
Each language is defined by a single ILDF file. ("Inweb Language Definition
|
||||||
|
@ -366,9 +374,7 @@ to be followed by |=>|: they always begin a block.
|
||||||
2. |characters in T| splits the snippet into each of its characters which
|
2. |characters in T| splits the snippet into each of its characters which
|
||||||
lie inside the text |T|. For example, here is a not very useful ILD for
|
lie inside the text |T|. For example, here is a not very useful ILD for
|
||||||
plain text in which all vowels are in red:
|
plain text in which all vowels are in red:
|
||||||
|
= (text from Dialects/VowelsExample.ildf as ILDF)
|
||||||
[[../Private Languages/VowelsExample.ildf as ILDF]]
|
|
||||||
|
|
||||||
Given the text:
|
Given the text:
|
||||||
= (not code)
|
= (not code)
|
||||||
A noir, E blanc, I rouge, U vert, O bleu : voyelles,
|
A noir, E blanc, I rouge, U vert, O bleu : voyelles,
|
||||||
|
@ -386,7 +392,7 @@ Qui bombinent autour des puanteurs cruelles,
|
||||||
|
|
||||||
3. The split |instances of X| narrows in on each usage of the text |X| inside
|
3. The split |instances of X| narrows in on each usage of the text |X| inside
|
||||||
the snippet. For example,
|
the snippet. For example,
|
||||||
[[../Private Languages/LineageExample.ildf as ILDF]]
|
= (text from Dialects/LineageExample.ildf as ILDF)
|
||||||
acts on the text:
|
acts on the text:
|
||||||
= (not code)
|
= (not code)
|
||||||
Jacob first appears in the Book of Genesis, the son of Isaac and Rebecca, the
|
Jacob first appears in the Book of Genesis, the son of Isaac and Rebecca, the
|
||||||
|
@ -403,7 +409,7 @@ while |====| would have two.
|
||||||
|
|
||||||
4. The split |runs of C|, where |C| describes a colour, splits the snippet
|
4. The split |runs of C|, where |C| describes a colour, splits the snippet
|
||||||
into non-overlapping contiguous pieces which have that colour. For example:
|
into non-overlapping contiguous pieces which have that colour. For example:
|
||||||
[[../Private Languages/RunningExample.ildf as ILDF]]
|
= (text from Dialects/RunningExample.ildf as ILDF)
|
||||||
acts on:
|
acts on:
|
||||||
= (not code)
|
= (not code)
|
||||||
Napoleon Bonaparte (1769-1821) took 167 scientists to Egypt in 1798,
|
Napoleon Bonaparte (1769-1821) took 167 scientists to Egypt in 1798,
|
||||||
|
@ -418,7 +424,7 @@ Here the hyphens in number ranges have been coloured, but not the hyphen
|
||||||
in "so-called".
|
in "so-called".
|
||||||
|
|
||||||
A more computer-science sort of example would be:
|
A more computer-science sort of example would be:
|
||||||
[[../Private Languages/StdioExample.ildf as ILDF]]
|
= (text from Dialects/StdioExample.ildf as ILDF)
|
||||||
which acts on:
|
which acts on:
|
||||||
= (not code)
|
= (not code)
|
||||||
if (x == 1) printf("Hello!");
|
if (x == 1) printf("Hello!");
|
||||||
|
@ -438,7 +444,7 @@ not a colour.
|
||||||
splits the snippet up into non-overlapping pieces which match it: possibly
|
splits the snippet up into non-overlapping pieces which match it: possibly
|
||||||
none at all, of course, in which case the block of rules is never used.
|
none at all, of course, in which case the block of rules is never used.
|
||||||
This is easier to demonstrate than explain:
|
This is easier to demonstrate than explain:
|
||||||
[[../Private Languages/AssemblageExample.ildf as ILDF]]
|
= (text from Dialects/AssemblageExample.ildf as ILDF)
|
||||||
which acts on:
|
which acts on:
|
||||||
= (not code)
|
= (not code)
|
||||||
JSR .initialise
|
JSR .initialise
|
||||||
|
@ -460,7 +466,7 @@ to produce:
|
||||||
regular expression |E|, and then runs the rules on each bracketed
|
regular expression |E|, and then runs the rules on each bracketed
|
||||||
subexpression in turn. (If there is no match, or there are no bracketed
|
subexpression in turn. (If there is no match, or there are no bracketed
|
||||||
terms in |E|, nothing happens.)
|
terms in |E|, nothing happens.)
|
||||||
[[../Private Languages/EquationsExample.ildf as ILDF]]
|
= (text from Dialects/EquationsExample.ildf as ILDF)
|
||||||
acts on:
|
acts on:
|
||||||
= (not code)
|
= (not code)
|
||||||
A = 2716
|
A = 2716
|
||||||
|
@ -552,7 +558,7 @@ is required to match the entire snippet, not just somewhere inside.
|
||||||
7. Whenever a split takes place, Inweb keeps count of how many pieces there are,
|
7. Whenever a split takes place, Inweb keeps count of how many pieces there are,
|
||||||
and different rules can apply to differently numbered pieces. The notation
|
and different rules can apply to differently numbered pieces. The notation
|
||||||
is |number N|, where |N| is the number, counting from 1. For example,
|
is |number N|, where |N| is the number, counting from 1. For example,
|
||||||
[[../Private Languages/ThirdExample.ildf as ILDF]]
|
= (text from Dialects/ThirdExample.ildf as ILDF)
|
||||||
acts on:
|
acts on:
|
||||||
= (not code)
|
= (not code)
|
||||||
With how sad steps, O Moon, thou climb'st the skies!
|
With how sad steps, O Moon, thou climb'st the skies!
|
||||||
|
@ -587,6 +593,28 @@ Do they above love to be lov'd, and yet
|
||||||
Those lovers scorn whom that love doth possess?
|
Those lovers scorn whom that love doth possess?
|
||||||
Do they call virtue there ungratefulness?
|
Do they call virtue there ungratefulness?
|
||||||
=
|
=
|
||||||
|
We can also cycle through a set of possibilities with |number N of M|,
|
||||||
|
where this time the count runs 1, 2, ..., |M|, 1, 2, ..., |M|, 1, ... and
|
||||||
|
so on. Thus |number 1 of 3| would work on the 1st, 4th, 7th, ... times;
|
||||||
|
|number 2 of 3| on the 2nd, 5th, 8th, ...; |number 3 of 3| on the 3rd, 6th,
|
||||||
|
9th, and so on. This, for example, paints the output from the painting
|
||||||
|
algorithm in Inweb:
|
||||||
|
= (text from Dialects/PainterOutput.ildf as ILDF)
|
||||||
|
since alternate lines are plain, for the original text, and then coloured,
|
||||||
|
to highlight the colours given to the characters in the original. Thus:
|
||||||
|
= (not code)
|
||||||
|
int x = 55; /* a magic number */
|
||||||
|
rrrpipppnnpp!!!!!!!!!!!!!!!!!!!!
|
||||||
|
Imaginary::function(x, beta);
|
||||||
|
fffffffffffffffffffpippiiiipp
|
||||||
|
=
|
||||||
|
becomes
|
||||||
|
= (sample PainterOutput code)
|
||||||
|
int x = 55; /* a magic number */
|
||||||
|
rrrpipppnnpp!!!!!!!!!!!!!!!!!!!!
|
||||||
|
Imaginary::function(x, beta);
|
||||||
|
fffffffffffffffffffpippiiiipp
|
||||||
|
=
|
||||||
|
|
||||||
@ Any condition can be reversed by preceding it with |not|. For example,
|
@ Any condition can be reversed by preceding it with |not|. For example,
|
||||||
= (sample ILDF code)
|
= (sample ILDF code)
|
||||||
|
@ -629,5 +657,4 @@ The rule |=> debug| is unconditional, and will print whenever it's reached.
|
||||||
Inweb Language Definition Format is a kind of language in itself, and in
|
Inweb Language Definition Format is a kind of language in itself, and in
|
||||||
fact Inweb is supplied with an ILD for ILDF itself, which Inweb used to
|
fact Inweb is supplied with an ILD for ILDF itself, which Inweb used to
|
||||||
syntax-colour the examples above. Here it is, as syntax-coloured by itself:
|
syntax-colour the examples above. Here it is, as syntax-coloured by itself:
|
||||||
|
= (text from Languages/ILDF.ildf as ILDF)
|
||||||
[[../Languages/ILDF.ildf as ILDF]]
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
# Inweb 7
|
# Inweb 7
|
||||||
|
|
||||||
v7 'Escape to Danger' (6 April 2020)
|
v7 'Escape to Danger' (7 April 2020)
|
||||||
|
|
||||||
## About Inweb
|
## About Inweb
|
||||||
|
|
||||||
|
|
2134
Tangled/inweb.c
2134
Tangled/inweb.c
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,3 @@
|
||||||
#ifndef PLATFORM_WINDOWS
|
|
||||||
#define PLATFORM_POSIX
|
|
||||||
#endif
|
|
||||||
/* Tangled output generated by inweb: do not edit */
|
/* Tangled output generated by inweb: do not edit */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#ifdef PLATFORM_WINDOWS
|
#ifdef PLATFORM_WINDOWS
|
||||||
|
|
|
@ -1,4 +1 @@
|
||||||
#ifndef PLATFORM_WINDOWS
|
|
||||||
#define PLATFORM_POSIX
|
|
||||||
#endif
|
|
||||||
/* Tangled output generated by inweb: do not edit */
|
/* Tangled output generated by inweb: do not edit */
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
#ifndef PLATFORM_WINDOWS
|
|
||||||
#define PLATFORM_POSIX
|
|
||||||
#endif
|
|
||||||
/* Tangled output generated by inweb: do not edit */
|
/* Tangled output generated by inweb: do not edit */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#line 9 "inweb/Tests/Test Cases/hellow.inweb"
|
#line 9 "inweb/Tests/Test Cases/hellow.inweb"
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
#ifndef PLATFORM_WINDOWS
|
|
||||||
#define PLATFORM_POSIX
|
|
||||||
#endif
|
|
||||||
/* Tangled output generated by inweb: do not edit */
|
/* Tangled output generated by inweb: do not edit */
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#define RANGE 100
|
#define RANGE 100
|
||||||
|
|
|
@ -455,12 +455,11 @@ main {
|
||||||
<!--Weave of 'Complete Program' generated by 7-->
|
<!--Weave of 'Complete Program' generated by 7-->
|
||||||
<ul class="crumbs"><li><b>hellow</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>§1. </b></p>
|
<ul class="crumbs"><li><b>hellow</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>§1. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">stdio</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">stdio</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
||||||
|
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span>
|
||||||
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"Hello world!\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"Hello world!\n"</span><span class="plain">);</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
@ -472,7 +471,7 @@ main {
|
||||||
|
|
||||||
|
|
||||||
<pre class="definitions">
|
<pre class="definitions">
|
||||||
<span class="definitionkeyword">define</span> <span class="constant">PEACH</span><span class="plain"> 1</span>
|
<span class="definitionkeyword">define</span> <span class="constant">PEACH</span><span class="plain"> </span><span class="constant">1</span>
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">A_COM</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">A_COM</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">B_COM</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">B_COM</span>
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">C_COM</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">C_COM</span>
|
||||||
|
@ -499,7 +498,6 @@ main {
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> </span><span class="string">"existent.h"</span>
|
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> </span><span class="string">"existent.h"</span>
|
||||||
|
|
||||||
|
|
|
@ -459,7 +459,6 @@ Ipsum. But <code class="display"><span class="extract">identifier</span></code>
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">Green.</span>
|
<span class="plain">Green.</span>
|
||||||
<span class="plain">Blue.</span>
|
<span class="plain">Blue.</span>
|
||||||
|
|
|
@ -455,12 +455,11 @@ main {
|
||||||
<!--Weave of 'Complete Program' generated by 7-->
|
<!--Weave of 'Complete Program' generated by 7-->
|
||||||
<ul class="crumbs"><li><b>hellow</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>§1. </b></p>
|
<ul class="crumbs"><li><b>hellow</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>§1. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">stdio</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">stdio</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
||||||
|
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">argv</span><span class="plain">[]) {</span>
|
||||||
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"Hello world!\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
|
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"Hello world!\n"</span><span class="plain">);</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
|
|
@ -455,21 +455,19 @@ main {
|
||||||
<!--Weave of 'Complete Program' generated by 7-->
|
<!--Weave of 'Complete Program' generated by 7-->
|
||||||
<ul class="crumbs"><li><b>perl</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>§1. </b></p>
|
<ul class="crumbs"><li><b>perl</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>§1. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">print recolour("Santa likes red and green socks.\n");</span>
|
<span class="identifier">print</span><span class="plain"> </span><span class="identifier">recolour</span><span class="plain">(</span><span class="string">"Santa likes red and green socks.\n"</span><span class="plain">);</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">sub recolour {</span>
|
<span class="identifier">sub</span><span class="plain"> </span><span class="identifier">recolour</span><span class="plain"> {</span>
|
||||||
<span class="plain">my $text = $_[0];</span>
|
<span class="identifier">my</span><span class="plain"> $</span><span class="identifier">text</span><span class="plain"> = $</span><span class="identifier">_</span><span class="plain">[0];</span>
|
||||||
<<span class="cwebmacro">Change the hues</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
<<span class="cwebmacro">Change the hues</span> <span class="cwebmacronumber">2.1</span>><span class="plain">;</span>
|
||||||
<span class="plain">return $text;</span>
|
<span class="identifier">return</span><span class="plain"> $</span><span class="identifier">text</span><span class="plain">;</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
@ -481,8 +479,8 @@ main {
|
||||||
|
|
||||||
|
|
||||||
<pre class="displaydefn">
|
<pre class="displaydefn">
|
||||||
<span class="plain">$text =~ s/red/blue/;</span>
|
<span class="plain">$</span><span class="identifier">text</span><span class="plain"> =~ </span><span class="identifier">s</span><span class="plain">/</span><span class="identifier">red</span><span class="plain">/</span><span class="identifier">blue</span><span class="plain">/;</span>
|
||||||
<span class="plain">$text =~ s/green/purple/;</span>
|
<span class="plain">$</span><span class="identifier">text</span><span class="plain"> =~ </span><span class="identifier">s</span><span class="plain">/</span><span class="identifier">green</span><span class="plain">/</span><span class="identifier">purple</span><span class="plain">/;</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
|
@ -455,7 +455,6 @@ main {
|
||||||
<!--Weave of 'Complete Program' generated by 7-->
|
<!--Weave of 'Complete Program' generated by 7-->
|
||||||
<ul class="crumbs"><li><b>plain</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>§1. </b></p>
|
<ul class="crumbs"><li><b>plain</b></li></ul><p class="inwebparagraph"><a id="SP1"></a><b>§1. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<<span class="cwebmacro">Titling</span> <span class="cwebmacronumber">1.1</span>>
|
<<span class="cwebmacro">Titling</span> <span class="cwebmacronumber">1.1</span>>
|
||||||
<span class="plain">No one would have believed in the last years of the</span>
|
<span class="plain">No one would have believed in the last years of the</span>
|
||||||
|
@ -485,7 +484,6 @@ main {
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">With infinite complacency men went to and fro over this globe about</span>
|
<span class="plain">With infinite complacency men went to and fro over this globe about</span>
|
||||||
<span class="plain">their little affairs, serene in their assurance of their empire over matter.</span>
|
<span class="plain">their little affairs, serene in their assurance of their empire over matter.</span>
|
||||||
|
|
|
@ -463,7 +463,7 @@ simplest method possible.
|
||||||
|
|
||||||
|
|
||||||
<pre class="definitions">
|
<pre class="definitions">
|
||||||
<span class="definitionkeyword">define</span> <span class="constant">RANGE</span><span class="plain"> 100</span>
|
<span class="definitionkeyword">define</span> <span class="constant">RANGE</span><span class="plain"> </span><span class="constant">100</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
|
@ -486,7 +486,7 @@ simplest method possible.
|
||||||
|
|
||||||
<pre class="displaydefn">
|
<pre class="displaydefn">
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">isprime</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">)) && (</span><span class="functiontext">isprime</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">+2)))</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">isprime</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">)) && (</span><span class="functiontext">isprime</span><span class="plain">(</span><span class="identifier">i</span><span class="plain">+2)))</span>
|
||||||
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"%d and %d\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2);</span>
|
<span class="identifier">printf</span><span class="plain">(</span><span class="string">"%d and %d\n"</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">i</span><span class="plain">+2);</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
@ -496,7 +496,6 @@ simplest method possible.
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>This ought to print:
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>This ought to print:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">3 and 5</span>
|
<span class="plain">3 and 5</span>
|
||||||
<span class="plain">5 and 7</span>
|
<span class="plain">5 and 7</span>
|
||||||
|
@ -512,15 +511,15 @@ simplest method possible.
|
||||||
|
|
||||||
|
|
||||||
<pre class="definitions">
|
<pre class="definitions">
|
||||||
<span class="definitionkeyword">define</span> <span class="constant">TRUE</span><span class="plain"> 1</span>
|
<span class="definitionkeyword">define</span> <span class="constant">TRUE</span><span class="plain"> </span><span class="constant">1</span>
|
||||||
<span class="definitionkeyword">define</span> <span class="constant">FALSE</span><span class="plain"> 0</span>
|
<span class="definitionkeyword">define</span> <span class="constant">FALSE</span><span class="plain"> </span><span class="constant">0</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">isprime</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">isprime</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> <= 1) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> <= </span><span class="constant">1</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">m</span><span class="plain"> = 2; </span><span class="identifier">m</span><span class="plain">*</span><span class="identifier">m</span><span class="plain"> <= </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">m</span><span class="plain">++)</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">m</span><span class="plain"> = </span><span class="constant">2</span><span class="plain">; </span><span class="identifier">m</span><span class="plain">*</span><span class="identifier">m</span><span class="plain"> <= </span><span class="identifier">n</span><span class="plain">; </span><span class="identifier">m</span><span class="plain">++)</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> % </span><span class="identifier">m</span><span class="plain"> == 0)</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> % </span><span class="identifier">m</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">)</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
|
|
5
Tests/Test Painter/AssemblageExample.txt
Normal file
5
Tests/Test Painter/AssemblageExample.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
JSR .initialise
|
||||||
|
LDR A, #.data
|
||||||
|
RTS
|
||||||
|
.initialise
|
||||||
|
TAX
|
4
Tests/Test Painter/EquationsExample.txt
Normal file
4
Tests/Test Painter/EquationsExample.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
A = 2716
|
||||||
|
B=3
|
||||||
|
C =715 + B
|
||||||
|
D < 14
|
2
Tests/Test Painter/LineageExample.txt
Normal file
2
Tests/Test Painter/LineageExample.txt
Normal 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.
|
4
Tests/Test Painter/PainterOutput.txt
Normal file
4
Tests/Test Painter/PainterOutput.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
int x = 55; /* a magic number */
|
||||||
|
rrrpipppnnpp!!!!!!!!!!!!!!!!!!!!
|
||||||
|
Imaginary::function(x, beta);
|
||||||
|
fffffffffffffffffffpippiiiipp
|
2
Tests/Test Painter/RunningExample.txt
Normal file
2
Tests/Test Painter/RunningExample.txt
Normal 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.
|
1
Tests/Test Painter/StdioExample.txt
Normal file
1
Tests/Test Painter/StdioExample.txt
Normal file
|
@ -0,0 +1 @@
|
||||||
|
if (x == 1) printf("Hello!");
|
14
Tests/Test Painter/ThirdExample.txt
Normal file
14
Tests/Test Painter/ThirdExample.txt
Normal 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?
|
4
Tests/Test Painter/VowelsExample.txt
Normal file
4
Tests/Test Painter/VowelsExample.txt
Normal 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,
|
13
Tests/Test Painter/_Results_Ideal/AssemblageExample.txt
Normal file
13
Tests/Test Painter/_Results_Ideal/AssemblageExample.txt
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
Test of colouring for language AssemblageExample:
|
||||||
|
JSR .initialise
|
||||||
|
LDR A, #.data
|
||||||
|
RTS
|
||||||
|
.initialise
|
||||||
|
TAX
|
||||||
|
|
||||||
|
ppppppppiiipfffffffffff
|
||||||
|
ppppppppiiipipppfffff
|
||||||
|
ppppppppiii
|
||||||
|
ppppfffffffffff
|
||||||
|
ppppppppiii
|
||||||
|
|
11
Tests/Test Painter/_Results_Ideal/EquationsExample.txt
Normal file
11
Tests/Test Painter/_Results_Ideal/EquationsExample.txt
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
Test of colouring for language EquationsExample:
|
||||||
|
A = 2716
|
||||||
|
B=3
|
||||||
|
C =715 + B
|
||||||
|
D < 14
|
||||||
|
|
||||||
|
ppppfpppffff
|
||||||
|
ppppfpf
|
||||||
|
ppppfppfffpppp
|
||||||
|
pppppppppp
|
||||||
|
|
7
Tests/Test Painter/_Results_Ideal/LineageExample.txt
Normal file
7
Tests/Test Painter/_Results_Ideal/LineageExample.txt
Normal 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
|
||||||
|
|
11
Tests/Test Painter/_Results_Ideal/PainterOutput.txt
Normal file
11
Tests/Test Painter/_Results_Ideal/PainterOutput.txt
Normal 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
|
||||||
|
|
7
Tests/Test Painter/_Results_Ideal/RunningExample.txt
Normal file
7
Tests/Test Painter/_Results_Ideal/RunningExample.txt
Normal 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
|
||||||
|
|
5
Tests/Test Painter/_Results_Ideal/StdioExample.txt
Normal file
5
Tests/Test Painter/_Results_Ideal/StdioExample.txt
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
Test of colouring for language StdioExample:
|
||||||
|
if (x == 1) printf("Hello!");
|
||||||
|
|
||||||
|
iippippppnppffffffppiiiiipppp
|
||||||
|
|
31
Tests/Test Painter/_Results_Ideal/ThirdExample.txt
Normal file
31
Tests/Test Painter/_Results_Ideal/ThirdExample.txt
Normal 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
|
||||||
|
|
11
Tests/Test Painter/_Results_Ideal/VowelsExample.txt
Normal file
11
Tests/Test Painter/_Results_Ideal/VowelsExample.txt
Normal 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
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
-cases [Inweb] 'inweb/Tests/Test Cases'
|
-cases [Inweb] 'inweb/Tests/Test Cases'
|
||||||
|
-cases [Painter] 'inweb/Tests/Test Painter'
|
||||||
|
|
||||||
-recipe [Inweb]
|
-recipe [Inweb]
|
||||||
set: $INWEB = inweb/Tangled/inweb
|
set: $INWEB = inweb/Tangled/inweb
|
||||||
|
@ -42,3 +43,24 @@
|
||||||
pass: 'passed'
|
pass: 'passed'
|
||||||
|
|
||||||
-end
|
-end
|
||||||
|
|
||||||
|
-recipe [Painter]
|
||||||
|
set: $INWEB = inweb/Tangled/inweb
|
||||||
|
set: $LANGUAGES = inweb/Dialects
|
||||||
|
set: $INTERNAL = Internal
|
||||||
|
|
||||||
|
set: $CANVAS = $PATH/$CASE.txt
|
||||||
|
mkdir: $PATH/_Results_Actual
|
||||||
|
mkdir: $PATH/_Results_Ideal
|
||||||
|
mkdir: $PATH/_Results_Console
|
||||||
|
set: $A = $PATH/_Results_Actual/$CASE.txt
|
||||||
|
set: $I = $PATH/_Results_Ideal/$CASE.txt
|
||||||
|
step: $INWEB -test-language-on $CANVAS -test-language $LANGUAGES/$CASE.ildf >$A 2>&1
|
||||||
|
or: 'failed inweb' $A
|
||||||
|
show: $A
|
||||||
|
match text: $A $I
|
||||||
|
or: 'produced the wrong painting'
|
||||||
|
|
||||||
|
pass: 'passed'
|
||||||
|
|
||||||
|
-end
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
Prerelease: alpha.1
|
Prerelease: alpha.1
|
||||||
Build Date: 6 April 2020
|
Build Date: 7 April 2020
|
||||||
Build Number: 1A12
|
Build Number: 1A13
|
||||||
|
|
|
@ -47,7 +47,6 @@ other tools or libraries to speak of, you could do worse.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">Import: foundation</span>
|
<span class="plain">Import: foundation</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -70,7 +69,6 @@ Because pthread is not normally available on Windows, a special header is
|
||||||
supplied instead for that case.
|
supplied instead for that case.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">ctype</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">ctype</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
||||||
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">stdarg</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">stdarg</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
||||||
|
@ -86,7 +84,6 @@ supplied instead for that case.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">DL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">Current destination of debugging text: kept <code class="display"><span class="extract">NULL</span></code> until opened</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">DL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">Current destination of debugging text: kept <code class="display"><span class="extract">NULL</span></code> until opened</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -128,7 +125,6 @@ compromise in practice:
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Very occasionally we'll store a pointer as data:
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Very occasionally we'll store a pointer as data:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pointer_sized_int</span><span class="plain">;</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">pointer_sized_int</span><span class="plain">;</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -143,7 +139,6 @@ shutting down.
|
||||||
that is, literal <code class="display"><span class="extract">text_stream *</span></code> values written as <code class="display"><span class="extract">I"strings"</span></code>.
|
that is, literal <code class="display"><span class="extract">text_stream *</span></code> values written as <code class="display"><span class="extract">I"strings"</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Foundation::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Foundation::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Memory::start</span><span class="plain">();</span>
|
<span class="functiontext">Memory::start</span><span class="plain">();</span>
|
||||||
|
@ -278,7 +273,6 @@ an early termination due to a fatal error, as this may lead to thread
|
||||||
safety problems.
|
safety problems.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Foundation::end</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Foundation::end</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">MEMORY_USAGE_DA</span><span class="plain">)) </span><span class="functiontext">Memory::log_statistics</span><span class="plain">();</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Log::aspect_switched_on</span><span class="plain">(</span><span class="constant">MEMORY_USAGE_DA</span><span class="plain">)) </span><span class="functiontext">Memory::log_statistics</span><span class="plain">();</span>
|
||||||
|
|
|
@ -143,7 +143,6 @@ of files are encoded (as ASCII, as ISO Latin-1, as UTF-8, etc.). The default
|
||||||
here is UTF-8 since OS X and Linux both adopt this.
|
here is UTF-8 since OS X and Linux both adopt this.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="constant">LOCALE_IS_ISO</span>
|
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="constant">LOCALE_IS_ISO</span>
|
||||||
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">LOCALE_IS_UTF8</span>
|
<span class="plain">#</span><span class="identifier">ifndef</span><span class="plain"> </span><span class="identifier">LOCALE_IS_UTF8</span>
|
||||||
|
@ -158,7 +157,6 @@ here is UTF-8 since OS X and Linux both adopt this.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Environment variables. </b></p>
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Environment variables. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Platform::getenv</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
|
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Platform::getenv</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">getenv</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">getenv</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
|
||||||
|
@ -179,7 +177,6 @@ always be unavailable: that doesn't mean we can't run on those platforms,
|
||||||
just that installation and use of Foundation-built tools is less convenient.)
|
just that installation and use of Foundation-built tools is less convenient.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain">[</span><span class="identifier">PATH_MAX</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">];</span>
|
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain">[</span><span class="identifier">PATH_MAX</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">];</span>
|
||||||
|
@ -243,7 +240,6 @@ string.
|
||||||
<p class="inwebparagraph"><a id="SP9_1_1"></a><b>§9.1.1. </b>And now the Mac version:
|
<p class="inwebparagraph"><a id="SP9_1_1"></a><b>§9.1.1. </b>And now the Mac version:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">_NSGetExecutablePath</span><span class="plain">(</span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">buf</span><span class="plain">, </span><span class="identifier">uint32_t</span><span class="plain">* </span><span class="identifier">bufsize</span><span class="plain">);</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">_NSGetExecutablePath</span><span class="plain">(</span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">buf</span><span class="plain">, </span><span class="identifier">uint32_t</span><span class="plain">* </span><span class="identifier">bufsize</span><span class="plain">);</span>
|
||||||
|
|
||||||
|
@ -278,7 +274,6 @@ string.
|
||||||
<p class="inwebparagraph"><a id="SP9_1_2"></a><b>§9.1.2. </b>For Unix, there's nothing we can generically do.
|
<p class="inwebparagraph"><a id="SP9_1_2"></a><b>§9.1.2. </b>For Unix, there's nothing we can generically do.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
||||||
<<span class="cwebmacro">Fail</span> <span class="cwebmacronumber">9.1.4</span>><span class="plain">;</span>
|
<<span class="cwebmacro">Fail</span> <span class="cwebmacronumber">9.1.4</span>><span class="plain">;</span>
|
||||||
|
@ -294,7 +289,6 @@ string.
|
||||||
<p class="inwebparagraph"><a id="SP9_1_3"></a><b>§9.1.3. </b>On Android, there's no real need for this.
|
<p class="inwebparagraph"><a id="SP9_1_3"></a><b>§9.1.3. </b>On Android, there's no real need for this.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
||||||
<<span class="cwebmacro">Fail</span> <span class="cwebmacronumber">9.1.4</span>><span class="plain">;</span>
|
<<span class="cwebmacro">Fail</span> <span class="cwebmacronumber">9.1.4</span>><span class="plain">;</span>
|
||||||
|
@ -329,7 +323,6 @@ string.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Shell commands. </b></p>
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Shell commands. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::system</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cmd</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::system</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cmd</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">system</span><span class="plain">(</span><span class="identifier">cmd</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">system</span><span class="plain">(</span><span class="identifier">cmd</span><span class="plain">);</span>
|
||||||
|
@ -363,7 +356,6 @@ bugs in Intest, with the worker threads apparently writing on each other's
|
||||||
memory space. Using <code class="display"><span class="extract">posix_spawn()</span></code> instead appears to work better.
|
memory space. Using <code class="display"><span class="extract">posix_spawn()</span></code> instead appears to work better.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">spawn</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</span><span class="identifier">spawn</span><span class="plain">.</span><span class="identifier">h</span><span class="plain">></span>
|
||||||
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</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">></span>
|
<span class="plain">#</span><span class="identifier">include</span><span class="plain"> <</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">></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>§12. Directory handling. </b></p>
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Directory handling. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::mkdir</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_pathname</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::mkdir</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_pathname</span><span class="plain">) {</span>
|
||||||
<span class="identifier">errno</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="identifier">errno</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -448,7 +439,6 @@ is one which is earlier than any possible timestamp on the files we'll
|
||||||
be dealing with.
|
be dealing with.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Platform::never_time</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Platform::never_time</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">time_t</span><span class="plain">) </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">time_t</span><span class="plain">) </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -477,7 +467,6 @@ anything different which was originally in <code class="display"><span class="ex
|
||||||
<p class="inwebparagraph">In POSIX world, we can fairly well depend on <code class="display"><span class="extract">rsync</span></code> being around:
|
<p class="inwebparagraph">In POSIX world, we can fairly well depend on <code class="display"><span class="extract">rsync</span></code> being around:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::rsync</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_source</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_dest</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::rsync</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_source</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_dest</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">rsync_command</span><span class="plain">[10*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
|
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">rsync_command</span><span class="plain">[10*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
|
||||||
|
@ -512,7 +501,6 @@ anything different which was originally in <code class="display"><span class="ex
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Sleep. </b></p>
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Sleep. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::sleep</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seconds</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::sleep</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seconds</span><span class="plain">) {</span>
|
||||||
<span class="identifier">sleep</span><span class="plain">((</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">seconds</span><span class="plain">);</span>
|
<span class="identifier">sleep</span><span class="plain">((</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">seconds</span><span class="plain">);</span>
|
||||||
|
@ -537,7 +525,6 @@ to survive, given the MacOS team's current hostility to scripting; we're
|
||||||
actually running a one-line AppleScript here.
|
actually running a one-line AppleScript here.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">sound_name</span><span class="plain"> = </span><span class="string">"Bell.aiff"</span><span class="plain">;</span>
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">sound_name</span><span class="plain"> = </span><span class="string">"Bell.aiff"</span><span class="plain">;</span>
|
||||||
|
@ -558,7 +545,6 @@ actually running a one-line AppleScript here.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b></p>
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
|
@ -572,7 +558,6 @@ actually running a one-line AppleScript here.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Concurrency. </b></p>
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Concurrency. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="identifier">pthread_t</span><span class="plain"> </span><span class="identifier">foundation_thread</span><span class="plain">;</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="identifier">pthread_t</span><span class="plain"> </span><span class="identifier">foundation_thread</span><span class="plain">;</span>
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="identifier">pthread_attr_t</span><span class="plain"> </span><span class="identifier">foundation_thread_attributes</span><span class="plain">;</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="identifier">pthread_attr_t</span><span class="plain"> </span><span class="identifier">foundation_thread_attributes</span><span class="plain">;</span>
|
||||||
|
@ -584,7 +569,6 @@ actually running a one-line AppleScript here.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP19"></a><b>§19. </b></p>
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::create_thread</span><span class="plain">(</span><span class="identifier">foundation_thread</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::create_thread</span><span class="plain">(</span><span class="identifier">foundation_thread</span><span class="plain"> *</span><span class="identifier">pt</span><span class="plain">,</span>
|
||||||
<span class="reserved">const</span><span class="plain"> </span><span class="identifier">foundation_thread_attributes</span><span class="plain"> *</span><span class="identifier">pa</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *(*</span><span class="identifier">fn</span><span class="plain">)(</span><span class="reserved">void</span><span class="plain"> *), </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
<span class="reserved">const</span><span class="plain"> </span><span class="identifier">foundation_thread_attributes</span><span class="plain"> *</span><span class="identifier">pa</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *(*</span><span class="identifier">fn</span><span class="plain">)(</span><span class="reserved">void</span><span class="plain"> *), </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
||||||
|
|
|
@ -96,7 +96,6 @@ And with Windows GCC, <code class="display"><span class="extract">isdigit(-23)</
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Environment variables. </b></p>
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Environment variables. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">GetCurrentDirectoryA</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">len</span><span class="plain">, </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">buffer</span><span class="plain">);</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">GetCurrentDirectoryA</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">len</span><span class="plain">, </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">buffer</span><span class="plain">);</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">SHGetFolderPathA</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">wnd</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">folder</span><span class="plain">,</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">SHGetFolderPathA</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">wnd</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">folder</span><span class="plain">,</span>
|
||||||
|
@ -132,7 +131,6 @@ always be unavailable: that doesn't mean we can't run on those platforms,
|
||||||
just that installation and use of Foundation-built tools is less convenient.)
|
just that installation and use of Foundation-built tools is less convenient.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::where_am_i</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
||||||
<span class="identifier">DWORD</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">GetModuleFileNameW</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">);</span>
|
<span class="identifier">DWORD</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">GetModuleFileNameW</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">);</span>
|
||||||
|
@ -148,7 +146,6 @@ just that installation and use of Foundation-built tools is less convenient.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Shell commands. </b></p>
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Shell commands. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Startup_Info</span><span class="plain"> {</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Startup_Info</span><span class="plain"> {</span>
|
||||||
<span class="reserved">long</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v2</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v3</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v4</span><span class="plain">; </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">v5</span><span class="plain">; </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">v6</span><span class="plain">;</span>
|
<span class="reserved">long</span><span class="plain"> </span><span class="identifier">v1</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v2</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v3</span><span class="plain">; </span><span class="reserved">char</span><span class="plain">* </span><span class="identifier">v4</span><span class="plain">; </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">v5</span><span class="plain">; </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">v6</span><span class="plain">;</span>
|
||||||
|
@ -208,7 +205,6 @@ just that installation and use of Foundation-built tools is less convenient.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Directory handling. </b></p>
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Directory handling. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::mkdir</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_pathname</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Platform::mkdir</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">transcoded_pathname</span><span class="plain">) {</span>
|
||||||
<span class="identifier">errno</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="identifier">errno</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -262,7 +258,6 @@ just that installation and use of Foundation-built tools is less convenient.)
|
||||||
POSIX <code class="display"><span class="extract">sleep</span></code> is for seconds.
|
POSIX <code class="display"><span class="extract">sleep</span></code> is for seconds.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="identifier">Sleep</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">ms</span><span class="plain">);</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="identifier">Sleep</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">ms</span><span class="plain">);</span>
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::sleep</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seconds</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::sleep</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">seconds</span><span class="plain">) {</span>
|
||||||
|
@ -278,7 +273,6 @@ POSIX <code class="display"><span class="extract">sleep</span></code> is for sec
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Notifications. </b></p>
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Notifications. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Platform::notification</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">happy</span><span class="plain">) {</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
|
@ -293,7 +287,6 @@ POSIX <code class="display"><span class="extract">sleep</span></code> is for sec
|
||||||
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Concurrency. </b>The following predeclarations come from the Windows SDK.
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Concurrency. </b>The following predeclarations come from the Windows SDK.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">CreateThread</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">* </span><span class="identifier">attrs</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">stack</span><span class="plain">,</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">CreateThread</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">* </span><span class="identifier">attrs</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">stack</span><span class="plain">,</span>
|
||||||
<span class="reserved">void</span><span class="plain">* </span><span class="identifier">func</span><span class="plain">, </span><span class="reserved">void</span><span class="plain">* </span><span class="identifier">param</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">flags</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain">* </span><span class="identifier">id</span><span class="plain">);</span>
|
<span class="reserved">void</span><span class="plain">* </span><span class="identifier">func</span><span class="plain">, </span><span class="reserved">void</span><span class="plain">* </span><span class="identifier">param</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">flags</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain">* </span><span class="identifier">id</span><span class="plain">);</span>
|
||||||
|
@ -313,7 +306,6 @@ POSIX <code class="display"><span class="extract">sleep</span></code> is for sec
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b></p>
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">Platform::Win32_Thread_Func</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">param</span><span class="plain">) {</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">__stdcall</span><span class="plain"> </span><span class="functiontext">Platform::Win32_Thread_Func</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">long</span><span class="plain"> </span><span class="identifier">param</span><span class="plain">) {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Thread_Start</span><span class="plain">* </span><span class="identifier">start</span><span class="plain"> = (</span><span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Thread_Start</span><span class="plain">*)</span><span class="identifier">param</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Thread_Start</span><span class="plain">* </span><span class="identifier">start</span><span class="plain"> = (</span><span class="reserved">struct</span><span class="plain"> </span><span class="identifier">Win32_Thread_Start</span><span class="plain">*)</span><span class="identifier">param</span><span class="plain">;</span>
|
||||||
|
@ -370,7 +362,6 @@ is one which is earlier than any possible timestamp on the files we'll
|
||||||
be dealing with.
|
be dealing with.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Platform::never_time</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Platform::never_time</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">time_t</span><span class="plain">) </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">time_t</span><span class="plain">) </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
|
|
@ -34,7 +34,6 @@ pointers to some external structure. Often these will also be texts, but
|
||||||
not necessarily.
|
not necessarily.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">dictionary</span><span class="plain"> {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">textual</span><span class="plain">; </span><span class="comment">values are texts?</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">textual</span><span class="plain">; </span><span class="comment">values are texts?</span>
|
||||||
|
@ -62,7 +61,6 @@ not necessarily.
|
||||||
efficiency's sake the caller can set them up with an initial size of her choice.
|
efficiency's sake the caller can set them up with an initial size of her choice.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="functiontext">Dictionaries::new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">textual</span><span class="plain">) {</span>
|
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="functiontext">Dictionaries::new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">textual</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> < </span><span class="constant">2</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"dictionary too small"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">S</span><span class="plain"> < </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>§3. Logging. </b></p>
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Logging. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Dictionaries::log</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Dictionaries::log</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span>
|
||||||
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Dictionary:\n"</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">D</span><span class="plain">); </span><span class="constant">INDENT</span><span class="plain">;</span>
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Dictionary:\n"</span><span class="plain">, (</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">D</span><span class="plain">); </span><span class="constant">INDENT</span><span class="plain">;</span>
|
||||||
|
@ -112,7 +109,6 @@ here. If there are <code class="display"><span class="extract">N</span></code> s
|
||||||
(from 0 to <code class="display"><span class="extract">N-1</span></code>) a given key value belongs in.
|
(from 0 to <code class="display"><span class="extract">N-1</span></code>) a given key value belongs in.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Dictionaries::hash</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Dictionaries::hash</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hash</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">hash</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -132,7 +128,6 @@ remain valid only until somebody writes a new value into the dictionary;
|
||||||
so be careful if thread safety's an issue.
|
so be careful if thread safety's an issue.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Dictionaries::find_p</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Dictionaries::find_p</span><span class="plain">(</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">K</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
||||||
|
@ -158,7 +153,6 @@ as wide text (so that we can use literals like <code class="display"><span class
|
||||||
streams. So we also offer versions suffixed <code class="display"><span class="extract">_literal</span></code>:
|
streams. So we also offer versions suffixed <code class="display"><span class="extract">_literal</span></code>:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find_literal</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">lit</span><span class="plain">) {</span>
|
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find_literal</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">lit</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">K</span><span class="plain">);</span>
|
||||||
|
@ -194,7 +188,6 @@ streams. So we also offer versions suffixed <code class="display"><span class="e
|
||||||
it (if <code class="display"><span class="extract">-1</span></code>).
|
it (if <code class="display"><span class="extract">-1</span></code>).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find_p</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">change</span><span class="plain">) {</span>
|
<span class="reserved">dict_entry</span><span class="plain"> *</span><span class="functiontext">Dictionaries::find_p</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">K</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">change</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><<span class="cwebmacro">Handle the null dictionary</span> <span class="cwebmacronumber">7.1</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="cwebmacro">Handle the null dictionary</span> <span class="cwebmacronumber">7.1</span>><span class="plain">;</span>
|
||||||
|
@ -335,7 +328,6 @@ same dictionary if deletions are a possibility.
|
||||||
values which are arbitrary pointers, so we have to use void pointers:
|
values which are arbitrary pointers, so we have to use void pointers:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Dictionaries::read_value</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -386,7 +378,6 @@ values which are arbitrary pointers, so we have to use void pointers:
|
||||||
so we provide convenient wrappers with the correct C types.
|
so we provide convenient wrappers with the correct C types.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Dictionaries::create_text</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Dictionaries::create_text</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrote to null dictionary"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrote to null dictionary"</span><span class="plain">);</span>
|
||||||
|
@ -412,7 +403,6 @@ so we provide convenient wrappers with the correct C types.
|
||||||
entry by reading the text pointer and then using <code class="display"><span class="extract">WRITE_TO</span></code>.
|
entry by reading the text pointer and then using <code class="display"><span class="extract">WRITE_TO</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Dictionaries::get_text</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Dictionaries::get_text</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -441,7 +431,6 @@ entry by reading the text pointer and then using <code class="display"><span cla
|
||||||
and free the memory when done:
|
and free the memory when done:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Dictionaries::dispose_of</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Dictionaries::dispose_of</span><span class="plain">(</span><span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain">-></span><span class="element">textual</span><span class="plain">)</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">D</span><span class="plain">-></span><span class="element">textual</span><span class="plain">)</span>
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. The DL stream. </b>The debugging log file occupies the following stream:
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. The DL stream. </b>The debugging log file occupies the following stream:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">debug_log_file_struct</span><span class="plain">; </span><span class="comment">The actual debugging log file</span>
|
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">debug_log_file_struct</span><span class="plain">; </span><span class="comment">The actual debugging log file</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">debug_log_file</span><span class="plain"> = &</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"> = &</span><span class="identifier">debug_log_file_struct</span><span class="plain">; </span><span class="comment">The actual debugging log file</span>
|
||||||
|
@ -51,7 +50,6 @@ instance, the pseudo-function-call
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">LOGIF(WHATEVER, "Heading %d skipped\n", n);</span>
|
<span class="plain">LOGIF(WHATEVER, "Heading %d skipped\n", n);</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -76,7 +74,6 @@ not, as we please. Each has a unique number and a name of up to three words in
|
||||||
length.
|
length.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">debugging_aspect</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">debugging_aspect</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">hyphenated_name</span><span class="plain">; </span><span class="comment">e.g., "memory-usage"</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">hyphenated_name</span><span class="plain">; </span><span class="comment">e.g., "memory-usage"</span>
|
||||||
|
@ -181,7 +178,6 @@ is possible this has been switched to be <code class="display"><span class="extr
|
||||||
temporarily the sentence tracing file: but we don't care.
|
temporarily the sentence tracing file: but we don't care.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">debug_log_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">debug_log_filename</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
|
||||||
|
@ -239,7 +235,6 @@ the debugging log can be divided into "phases", subdivided into "stages".
|
||||||
This is how.
|
This is how.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">debug_log_phase</span><span class="plain">[32];</span>
|
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">debug_log_phase</span><span class="plain">[32];</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">debug_log_subheading</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">debug_log_subheading</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">;</span>
|
||||||
|
@ -272,7 +267,6 @@ being logged, and is used by our main macros. Aspect 0 mandates writing to the
|
||||||
debug log, and is used when errors occur.
|
debug log, and is used when errors occur.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Log::aspect_switched_on</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">aspect</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Log::aspect_switched_on</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">aspect</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">decision</span><span class="plain"> = </span><span class="identifier">the_debugging_aspects</span><span class="plain">[</span><span class="identifier">aspect</span><span class="plain">].</span><span class="element">on_or_off</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">decision</span><span class="plain"> = </span><span class="identifier">the_debugging_aspects</span><span class="plain">[</span><span class="identifier">aspect</span><span class="plain">].</span><span class="element">on_or_off</span><span class="plain">;</span>
|
||||||
|
@ -295,7 +289,6 @@ debug log, and is used when errors occur.
|
||||||
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>We sometimes want to switch everything on, or switch everything off:
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. </b>We sometimes want to switch everything on, or switch everything off:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::set_all_aspects</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_state</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::set_all_aspects</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_state</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">DL</span><span class="plain">) </span><span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">DEBUGGING_LOG_INCLUSIONS</span><span class="plain">, </span><span class="string">"Set debugging aspect: everything -> %s\n"</span><span class="plain">,</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">DL</span><span class="plain">) </span><span class="identifier">LOGIF</span><span class="plain">(</span><span class="identifier">DEBUGGING_LOG_INCLUSIONS</span><span class="plain">, </span><span class="string">"Set debugging aspect: everything -> %s\n"</span><span class="plain">,</span>
|
||||||
|
@ -321,7 +314,6 @@ every space with a hyphen: for instance, <code class="display"><span class="extr
|
||||||
print out a list of debugging aspects to <code class="display"><span class="extract">STDOUT</span></code>.
|
print out a list of debugging aspects to <code class="display"><span class="extract">STDOUT</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Log::set_aspect_from_command_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">give_error</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Log::set_aspect_from_command_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">give_error</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">list_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">list_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
|
@ -358,7 +350,6 @@ print out a list of debugging aspects to <code class="display"><span class="extr
|
||||||
out again without having lost our earlier settings.
|
out again without having lost our earlier settings.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::tracing_on</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">starred</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::tracing_on</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">starred</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">heading</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">starred</span><span class="plain">) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">starred</span><span class="plain">) {</span>
|
||||||
|
@ -384,7 +375,6 @@ the reader with a list of other things which could have been put into it,
|
||||||
but weren't.
|
but weren't.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::show_debugging_settings_with_state</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Log::show_debugging_settings_with_state</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">state</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
|
|
@ -62,7 +62,6 @@ a few items, only one call to the memory manager is needed.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="functiontext">LinkedLists::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="functiontext">LinkedLists::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">ll</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain">);</span>
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">ll</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain">);</span>
|
||||||
|
@ -81,7 +80,6 @@ a few items, only one call to the memory manager is needed.
|
||||||
want speed rather than memory efficiency.
|
want speed rather than memory efficiency.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LinkedLists::add</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">to_end</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">LinkedLists::add</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">to_end</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
|
||||||
|
@ -117,7 +115,6 @@ want speed rather than memory efficiency.
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Because of the direction of the links, only removing from the front is quick:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Because of the direction of the links, only removing from the front is quick:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">LinkedLists::remove_from_front</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">LinkedLists::remove_from_front</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
|
||||||
|
@ -137,7 +134,6 @@ want speed rather than memory efficiency.
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>It's rather slower to delete from a known position in the middle:
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>It's rather slower to delete from a known position in the middle:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">LinkedLists::delete</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">LinkedLists::delete</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">L</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"null list"</span><span class="plain">);</span>
|
||||||
|
@ -166,7 +162,6 @@ want speed rather than memory efficiency.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. A function call API. </b></p>
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. A function call API. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LinkedLists::len</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">LinkedLists::len</span><span class="plain">(</span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">L</span><span class="plain">?(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">linked_list_length</span><span class="plain">):0;</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">L</span><span class="plain">?(</span><span class="identifier">L</span><span class="plain">-></span><span class="element">linked_list_length</span><span class="plain">):0;</span>
|
||||||
|
|
|
@ -45,7 +45,6 @@ structures of type <code class="display"><span class="extract">thingummy</span><
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">typedef struct thingummy {</span>
|
<span class="plain">typedef struct thingummy {</span>
|
||||||
<span class="plain"> int whatsit;</span>
|
<span class="plain"> int whatsit;</span>
|
||||||
|
@ -121,7 +120,6 @@ to the number of objects in each completed array (so, typically 100) and
|
||||||
the doubly linked list is of the arrays.
|
the doubly linked list is of the arrays.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">allocation_status_structure</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">allocation_status_structure</span><span class="plain"> {</span>
|
||||||
<span class="comment">actually needed for allocation purposes:</span>
|
<span class="comment">actually needed for allocation purposes:</span>
|
||||||
|
@ -146,7 +144,6 @@ fairly small array of the structures defined above. The allocator can safely
|
||||||
begin as soon as this is initialised.
|
begin as soon as this is initialised.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">allocation_status_structure</span><span class="plain"> </span><span class="identifier">alloc_status</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MT_VALUES</span><span class="plain">];</span>
|
<span class="reserved">allocation_status_structure</span><span class="plain"> </span><span class="identifier">alloc_status</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MT_VALUES</span><span class="plain">];</span>
|
||||||
|
|
||||||
|
@ -229,7 +226,6 @@ Each memory block consists of a header structure, followed by <code class="displ
|
||||||
null bytes, followed by actual data.
|
null bytes, followed by actual data.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">memblock_header</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">memblock_header</span><span class="plain"> {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">block_number</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">block_number</span><span class="plain">;</span>
|
||||||
|
@ -244,7 +240,6 @@ null bytes, followed by actual data.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b></p>
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">memblock_header</span><span class="plain"> *</span><span class="identifier">first_memblock_header</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">head of list of memory blocks</span>
|
<span class="reserved">memblock_header</span><span class="plain"> *</span><span class="identifier">first_memblock_header</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">head of list of memory blocks</span>
|
||||||
<span class="reserved">memblock_header</span><span class="plain"> *</span><span class="identifier">current_memblock_header</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">tail of list of memory blocks</span>
|
<span class="reserved">memblock_header</span><span class="plain"> *</span><span class="identifier">current_memblock_header</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">tail of list of memory blocks</span>
|
||||||
|
@ -258,7 +253,6 @@ null bytes, followed by actual data.
|
||||||
pair of routines.
|
pair of routines.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::allocate_another_block</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::allocate_another_block</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cp</span><span class="plain">;</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">cp</span><span class="plain">;</span>
|
||||||
|
@ -334,7 +328,6 @@ in turn, but of course being careful to avoid following links in a just-freed
|
||||||
block.
|
block.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::free</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::free</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Memory::free_ssas</span><span class="plain">();</span>
|
<span class="functiontext">Memory::free_ssas</span><span class="plain">();</span>
|
||||||
|
@ -382,7 +375,6 @@ a single large object, or a single array of small objects.
|
||||||
blocks, but we don't need to worry about that.)
|
blocks, but we don't need to worry about that.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">memory_frame</span><span class="plain"> *</span><span class="identifier">first_memory_frame</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">earliest memory frame ever allocated</span>
|
<span class="reserved">memory_frame</span><span class="plain"> *</span><span class="identifier">first_memory_frame</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">earliest memory frame ever allocated</span>
|
||||||
<span class="reserved">memory_frame</span><span class="plain"> *</span><span class="identifier">last_memory_frame</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">most recent memory frame allocated</span>
|
<span class="reserved">memory_frame</span><span class="plain"> *</span><span class="identifier">last_memory_frame</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">most recent memory frame allocated</span>
|
||||||
|
@ -398,7 +390,6 @@ memory usage, we would implicitly have an O(n^2) running time in the
|
||||||
amount of storage n allocated.
|
amount of storage n allocated.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">calls_to_cmi</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">calls_to_cmi</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::check_memory_integrity</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::check_memory_integrity</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
|
@ -436,7 +427,6 @@ list is checked for integrity; but we not seen how it is built. Every
|
||||||
memory frame is created by the following function:
|
memory frame is created by the following function:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::allocate</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">mem_type</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">extent</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::allocate</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">mem_type</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">extent</span><span class="plain">) {</span>
|
||||||
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
||||||
|
@ -720,7 +710,6 @@ used in the lower levels.
|
||||||
<p class="inwebparagraph">Here goes, then.
|
<p class="inwebparagraph">Here goes, then.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain">)</span>
|
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain">)</span>
|
||||||
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain">)</span>
|
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain">)</span>
|
||||||
|
@ -789,7 +778,6 @@ we need to use the equivalent of traditional <code class="display"><span class="
|
||||||
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>And here is the (very simple) implementation.
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>And here is the (very simple) implementation.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">memory_needs</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">];</span>
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">memory_needs</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">];</span>
|
||||||
|
|
||||||
|
@ -818,7 +806,6 @@ therefore the best estimate of how well we're doing is the "maximum memory
|
||||||
claimed" — the highest recorded net usage count over the run.
|
claimed" — the highest recorded net usage count over the run.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">max_memory_at_once_for_each_need</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">],</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">max_memory_at_once_for_each_need</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">],</span>
|
||||||
<span class="identifier">memory_claimed_for_each_need</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">],</span>
|
<span class="identifier">memory_claimed_for_each_need</span><span class="plain">[</span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">],</span>
|
||||||
|
@ -835,7 +822,6 @@ exit on any such failure, so that the caller can be certain that the return
|
||||||
values of these functions are always non-<code class="display"><span class="extract">NULL</span></code> pointers.
|
values of these functions are always non-<code class="display"><span class="extract">NULL</span></code> pointers.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::I7_calloc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">how_many</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">size_in_bytes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reason</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::I7_calloc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">how_many</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">size_in_bytes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reason</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Memory::I7_alloc</span><span class="plain">(</span><span class="identifier">how_many</span><span class="plain">, </span><span class="identifier">size_in_bytes</span><span class="plain">, </span><span class="identifier">reason</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Memory::I7_alloc</span><span class="plain">(</span><span class="identifier">how_many</span><span class="plain">, </span><span class="identifier">size_in_bytes</span><span class="plain">, </span><span class="identifier">reason</span><span class="plain">);</span>
|
||||||
|
@ -854,7 +840,6 @@ values of these functions are always non-<code class="display"><span class="extr
|
||||||
<p class="inwebparagraph"><a id="SP26"></a><b>§26. </b>And this, then, is the joint routine implementing both.
|
<p class="inwebparagraph"><a id="SP26"></a><b>§26. </b>And this, then, is the joint routine implementing both.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::I7_alloc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::I7_alloc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">) {</span>
|
||||||
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
||||||
|
@ -946,7 +931,6 @@ rarely and to allocate large blocks of memory.
|
||||||
<p class="inwebparagraph"><a id="SP27"></a><b>§27. </b>We also provide our own wrapper for <code class="display"><span class="extract">free</span></code>:
|
<p class="inwebparagraph"><a id="SP27"></a><b>§27. </b>We also provide our own wrapper for <code class="display"><span class="extract">free</span></code>:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::I7_free</span><span class="plain">(</span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">pointer</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bytes_freed</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::I7_free</span><span class="plain">(</span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">pointer</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">R</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bytes_freed</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">R</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">R</span><span class="plain"> >= </span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no such memory reason"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">R</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) || (</span><span class="identifier">R</span><span class="plain"> >= </span><span class="identifier">NO_DEFINED_MREASON_VALUES</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no such memory reason"</span><span class="plain">);</span>
|
||||||
|
@ -996,7 +980,6 @@ safe in memory. Since the length can't be extended, it's usually unsafe
|
||||||
to write to the result.
|
to write to the result.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Memory::new_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
|
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Memory::new_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
|
||||||
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
||||||
|
@ -1023,7 +1006,6 @@ to write to the result.
|
||||||
<p class="inwebparagraph"><a id="SP30"></a><b>§30. </b>And here we free any SSAs needed in the course of the run.
|
<p class="inwebparagraph"><a id="SP30"></a><b>§30. </b>And here we free any SSAs needed in the course of the run.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::free_ssas</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::free_ssas</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">string_storage_area</span><span class="plain"> *</span><span class="identifier">ssa</span><span class="plain">;</span>
|
<span class="reserved">string_storage_area</span><span class="plain"> *</span><span class="identifier">ssa</span><span class="plain">;</span>
|
||||||
|
@ -1040,7 +1022,6 @@ to write to the result.
|
||||||
report in the debugging log (for which, see below).
|
report in the debugging log (for which, see below).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::log_usage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">total</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::log_usage</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">total</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">total_claimed_simply</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">total_claimed_simply</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -1065,7 +1046,6 @@ report in the debugging log (for which, see below).
|
||||||
<p class="inwebparagraph"><a id="SP32"></a><b>§32. Memory usage report. </b>A small utility routine to help keep track of our unquestioned profligacy.
|
<p class="inwebparagraph"><a id="SP32"></a><b>§32. Memory usage report. </b>A small utility routine to help keep track of our unquestioned profligacy.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::log_statistics</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Memory::log_statistics</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_for_objects</span><span class="plain"> = </span><span class="constant">MEMORY_GRANULARITY</span><span class="plain">*</span><span class="identifier">no_blocks_allocated</span><span class="plain">; </span><span class="comment">usage in bytes</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_for_objects</span><span class="plain"> = </span><span class="constant">MEMORY_GRANULARITY</span><span class="plain">*</span><span class="identifier">no_blocks_allocated</span><span class="plain">; </span><span class="comment">usage in bytes</span>
|
||||||
|
@ -1177,7 +1157,6 @@ order of total number of bytes allocated.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP33"></a><b>§33. </b></p>
|
<p class="inwebparagraph"><a id="SP33"></a><b>§33. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::compare_usage</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::compare_usage</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ix1</span><span class="plain"> = *((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *) </span><span class="identifier">ent1</span><span class="plain">);</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">ix1</span><span class="plain"> = *((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *) </span><span class="identifier">ent1</span><span class="plain">);</span>
|
||||||
|
@ -1194,7 +1173,6 @@ order of total number of bytes allocated.
|
||||||
usage. Recall that <code class="display"><span class="extract">bytes</span></code> is measured in bytes, but <code class="display"><span class="extract">total</span></code> in kilobytes.
|
usage. Recall that <code class="display"><span class="extract">bytes</span></code> is measured in bytes, but <code class="display"><span class="extract">total</span></code> in kilobytes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::proportion</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bytes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">total</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Memory::proportion</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">bytes</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">total</span><span class="plain">) {</span>
|
||||||
<span class="reserved">float</span><span class="plain"> </span><span class="identifier">B</span><span class="plain"> = (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">bytes</span><span class="plain">, </span><span class="identifier">T</span><span class="plain"> = (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">total</span><span class="plain">;</span>
|
<span class="reserved">float</span><span class="plain"> </span><span class="identifier">B</span><span class="plain"> = (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">bytes</span><span class="plain">, </span><span class="identifier">T</span><span class="plain"> = (</span><span class="reserved">float</span><span class="plain">) </span><span class="identifier">total</span><span class="plain">;</span>
|
||||||
|
@ -1209,7 +1187,6 @@ usage. Recall that <code class="display"><span class="extract">bytes</span></cod
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP35"></a><b>§35. </b></p>
|
<p class="inwebparagraph"><a id="SP35"></a><b>§35. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::paranoid_calloc</span><span class="plain">(</span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> *</span><span class="functiontext">Memory::paranoid_calloc</span><span class="plain">(</span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">size_t</span><span class="plain"> </span><span class="identifier">S</span><span class="plain">) {</span>
|
||||||
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
||||||
|
@ -1329,7 +1306,6 @@ which is other than <code class="display"><span class="extract">void *</span></c
|
||||||
allocated objects above; so that leaves only humble <code class="display"><span class="extract">char *</span></code> pointers:
|
allocated objects above; so that leaves only humble <code class="display"><span class="extract">char *</span></code> pointers:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">MAKE_REFERENCE_ROUTINES</span><span class="plain">(</span><span class="reserved">char</span><span class="plain">, </span><span class="constant">1000</span><span class="plain">)</span>
|
<span class="identifier">MAKE_REFERENCE_ROUTINES</span><span class="plain">(</span><span class="reserved">char</span><span class="plain">, </span><span class="constant">1000</span><span class="plain">)</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
|
@ -64,7 +64,6 @@ tagged functions attached to it dynamically: those, we'll call "methods".
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>A "method set" is simply a linked list of methods:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>A "method set" is simply a linked list of methods:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">method_set</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">method_set</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">method</span><span class="plain"> *</span><span class="identifier">first_method</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">method</span><span class="plain"> *</span><span class="identifier">first_method</span><span class="plain">;</span>
|
||||||
|
@ -181,7 +180,6 @@ attach it to an object with a method set, using the <code class="display"><span
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">IMETHOD_CALL(some_object, UNUSED_METHOD_ID_MTID, I"Hello", 17)</span>
|
<span class="plain">IMETHOD_CALL(some_object, UNUSED_METHOD_ID_MTID, I"Hello", 17)</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
|
@ -87,7 +87,6 @@ formatted text to the current stream, which could be either a string or a
|
||||||
file. <code class="display"><span class="extract">PRINT</span></code> does the same but to <code class="display"><span class="extract">STDOUT</span></code>, and is thus essentially <code class="display"><span class="extract">printf</span></code>.
|
file. <code class="display"><span class="extract">PRINT</span></code> does the same but to <code class="display"><span class="extract">STDOUT</span></code>, and is thus essentially <code class="display"><span class="extract">printf</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">#</span><span class="identifier">define</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">...) </span><span class="functiontext">Writers::printf</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">args</span><span class="plain">)</span>
|
<span class="plain">#</span><span class="identifier">define</span><span class="plain"> </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">...) </span><span class="functiontext">Writers::printf</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">args</span><span class="plain">)</span>
|
||||||
|
|
||||||
|
@ -339,7 +338,6 @@ so out of the <code class="display"><span class="extract">chars_capacity</span><
|
||||||
<p class="inwebparagraph"><a id="SP18"></a><b>§18. </b>A statistic we keep, since it costs little:
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. </b>A statistic we keep, since it costs little:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_file_writes</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment">number of text files opened for writing during the run</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">total_file_writes</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="comment">number of text files opened for writing during the run</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -358,7 +356,6 @@ grow is the debugging file, and if it should reach 2 GB then it deserves to be
|
||||||
truncated and we will shed no tears.
|
truncated and we will shed no tears.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::initialise</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::initialise</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to initialise NULL stream"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to initialise NULL stream"</span><span class="plain">);</span>
|
||||||
|
@ -383,7 +380,6 @@ angle brackets, will be used automatically on writing. By default this flag
|
||||||
is clear, that is, no conversion is made.
|
is clear, that is, no conversion is made.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::enable_XML_escapes</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::enable_XML_escapes</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain">) </span><span class="identifier">stream</span><span class="plain">-></span><span class="element">stream_flags</span><span class="plain"> |= </span><span class="constant">USES_XML_ESCAPES_STRF</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain">) </span><span class="identifier">stream</span><span class="plain">-></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>§21. Logging. </b></p>
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. Logging. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::log</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vS</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::log</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vS</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain"> = (</span><span class="reserved">text_stream</span><span class="plain"> *) </span><span class="identifier">vS</span><span class="plain">;</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain"> = (</span><span class="reserved">text_stream</span><span class="plain"> *) </span><span class="identifier">vS</span><span class="plain">;</span>
|
||||||
|
@ -484,7 +479,6 @@ is clear, that is, no conversion is made.
|
||||||
and returns a <code class="display"><span class="extract">text_stream *</span></code> pointer to it; subsequent calls just return this wrapper.
|
and returns a <code class="display"><span class="extract">text_stream *</span></code> pointer to it; subsequent calls just return this wrapper.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">STDOUT_struct</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stdout_wrapper_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">STDOUT_struct</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stdout_wrapper_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Streams::get_stdout</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Streams::get_stdout</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
|
@ -509,7 +503,6 @@ and returns a <code class="display"><span class="extract">text_stream *</span></
|
||||||
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>And similarly for the standard error file.
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>And similarly for the standard error file.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">STDERR_struct</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stderr_wrapper_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">STDERR_struct</span><span class="plain">; </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">stderr_wrapper_initialised</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Streams::get_stderr</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Streams::get_stderr</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
|
@ -535,7 +528,6 @@ and returns a <code class="display"><span class="extract">text_stream *</span></
|
||||||
so we return <code class="display"><span class="extract">TRUE</span></code> if and only if successful.
|
so we return <code class="display"><span class="extract">TRUE</span></code> if and only if successful.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_file</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">encoding</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_file</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">encoding</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
||||||
|
@ -561,7 +553,6 @@ so we return <code class="display"><span class="extract">TRUE</span></code> if a
|
||||||
<p class="inwebparagraph"><a id="SP25"></a><b>§25. </b>Similarly for appending:
|
<p class="inwebparagraph"><a id="SP25"></a><b>§25. </b>Similarly for appending:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_file_append</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">encoding</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_file_append</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">encoding</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
||||||
|
@ -588,7 +579,6 @@ the text of the stream; this too can fail for host platform reasons, so again
|
||||||
we return a success code.
|
we return a success code.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_memory</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">capacity</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_to_memory</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">capacity</span><span class="plain">) {</span>
|
||||||
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
<span class="identifier">CREATE_MUTEX</span><span class="plain">(</span><span class="identifier">mutex</span><span class="plain">);</span>
|
||||||
|
@ -614,7 +604,6 @@ we return a success code.
|
||||||
If called validly, this cannot fail.
|
If called validly, this cannot fail.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> </span><span class="functiontext">Streams::new_buffer</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">capacity</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> </span><span class="functiontext">Streams::new_buffer</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">capacity</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to make stream wrapper for NULL string"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">at</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to make stream wrapper for NULL string"</span><span class="plain">);</span>
|
||||||
|
@ -638,7 +627,6 @@ by a C string. First, a wide string (a sequence of 32-bit Unicode code
|
||||||
points, null terminated):
|
points, null terminated):
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
||||||
|
@ -663,7 +651,6 @@ points, null terminated):
|
||||||
page of the Unicode set, null terminated):
|
page of the Unicode set, null terminated):
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_ISO_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_ISO_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
||||||
|
@ -687,7 +674,6 @@ page of the Unicode set, null terminated):
|
||||||
<p class="inwebparagraph"><a id="SP28_2"></a><b>§28.2. </b>Finally, a UTF-8 encoded C string:
|
<p class="inwebparagraph"><a id="SP28_2"></a><b>§28.2. </b>Finally, a UTF-8 encoded C string:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_UTF8_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_UTF8_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to open NULL stream"</span><span class="plain">);</span>
|
||||||
|
@ -734,7 +720,6 @@ page of the Unicode set, null terminated):
|
||||||
<p class="inwebparagraph"><a id="SP29"></a><b>§29. Converting to C strings. </b>Now for the converse problem.
|
<p class="inwebparagraph"><a id="SP29"></a><b>§29. Converting to C strings. </b>Now for the converse problem.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_wide_string</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_wide_string</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
||||||
|
@ -760,7 +745,6 @@ page of the Unicode set, null terminated):
|
||||||
ISO string:
|
ISO string:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_ISO_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_ISO_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
||||||
|
@ -785,7 +769,6 @@ ISO string:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP31"></a><b>§31. </b></p>
|
<p class="inwebparagraph"><a id="SP31"></a><b>§31. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_UTF8_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::write_as_UTF8_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">buffer_size</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
||||||
|
@ -822,7 +805,6 @@ ISO string:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP32"></a><b>§32. Locale versions. </b></p>
|
<p class="inwebparagraph"><a id="SP32"></a><b>§32. Locale versions. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_locale_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::open_from_locale_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
|
||||||
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">LOCALE_IS_UTF8</span>
|
<span class="plain">#</span><span class="identifier">ifdef</span><span class="plain"> </span><span class="identifier">LOCALE_IS_UTF8</span>
|
||||||
|
@ -864,7 +846,6 @@ ISO string:
|
||||||
<code class="display"><span class="extract">NULL</span></code>:
|
<code class="display"><span class="extract">NULL</span></code>:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::flush</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::flush</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
||||||
|
@ -879,7 +860,6 @@ ISO string:
|
||||||
<p class="inwebparagraph"><a id="SP34"></a><b>§34. </b>But closing is not allowed for <code class="display"><span class="extract">NULL</span></code> or the standard I/O wrappers:
|
<p class="inwebparagraph"><a id="SP34"></a><b>§34. </b>But closing is not allowed for <code class="display"><span class="extract">NULL</span></code> or the standard I/O wrappers:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::close</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::close</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to close NULL stream"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"tried to close NULL stream"</span><span class="plain">);</span>
|
||||||
|
@ -962,7 +942,6 @@ how continuations are made, below.
|
||||||
<p class="inwebparagraph"><a id="SP35"></a><b>§35. Writing. </b>Our equivalent of <code class="display"><span class="extract">fputc</span></code> reads:
|
<p class="inwebparagraph"><a id="SP35"></a><b>§35. Writing. </b>Our equivalent of <code class="display"><span class="extract">fputc</span></code> reads:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::putc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c_int</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::putc</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c_int</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
||||||
|
@ -1100,7 +1079,6 @@ hold any escape sequence when opened.
|
||||||
<p class="inwebparagraph"><a id="SP36"></a><b>§36. </b>Literal printing is just printing with XML escapes switched off:
|
<p class="inwebparagraph"><a id="SP36"></a><b>§36. </b>Literal printing is just printing with XML escapes switched off:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::literal</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::literal</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
||||||
|
@ -1121,7 +1099,6 @@ problem messages and then leave what they're doing incomplete, so we will
|
||||||
be a little cautious about assuming that a mismatch means an error.
|
be a little cautious about assuming that a mismatch means an error.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::indent</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::indent</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
||||||
|
@ -1161,7 +1138,6 @@ how much is written to <code class="display"><span class="extract">NULL</span></
|
||||||
field.
|
field.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::get_position</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::get_position</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -1181,7 +1157,6 @@ field.
|
||||||
no point, since it is used only in concert with backspacing.
|
no point, since it is used only in concert with backspacing.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::latest</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Streams::latest</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -1204,7 +1179,6 @@ no point, since it is used only in concert with backspacing.
|
||||||
zero byte found, so that putting a zero truncates it.
|
zero byte found, so that putting a zero truncates it.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Streams::get_char_at_index</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">) {</span>
|
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Streams::get_char_at_index</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"examining null stream"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"examining null stream"</span><span class="plain">);</span>
|
||||||
|
@ -1251,7 +1225,6 @@ such continuation blocks (which would be inefficient if we immediately had
|
||||||
to open similar ones again).
|
to open similar ones again).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::set_position</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::set_position</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">position</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">stream</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
|
||||||
|
@ -1282,7 +1255,6 @@ to open similar ones again).
|
||||||
<code class="display"><span class="extract">NULL</span></code>) but <code class="display"><span class="extract">to</span></code> can be anything (including <code class="display"><span class="extract">NULL</span></code>).
|
<code class="display"><span class="extract">NULL</span></code>) but <code class="display"><span class="extract">to</span></code> can be anything (including <code class="display"><span class="extract">NULL</span></code>).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::copy</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::copy</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain">;</span>
|
||||||
|
@ -1304,7 +1276,6 @@ to open similar ones again).
|
||||||
<p class="inwebparagraph"><a id="SP43"></a><b>§43. Writer. </b>This writes one stream into another one, which implements <code class="display"><span class="extract">%S</span></code>.
|
<p class="inwebparagraph"><a id="SP43"></a><b>§43. Writer. </b>This writes one stream into another one, which implements <code class="display"><span class="extract">%S</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vS</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Streams::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vS</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = (</span><span class="reserved">text_stream</span><span class="plain"> *) </span><span class="identifier">vS</span><span class="plain">;</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = (</span><span class="reserved">text_stream</span><span class="plain"> *) </span><span class="identifier">vS</span><span class="plain">;</span>
|
||||||
|
|
|
@ -64,7 +64,6 @@ so we have to do everything three times. (And then we have to do all that twice,
|
||||||
because the loggers don't use format strings.)
|
because the loggers don't use format strings.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">escapes_registered</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">escapes_registered</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">escapes_category</span><span class="plain">[2][128]; </span><span class="comment">one of the <code class="display"><span class="extract">*_ECAT</span></code> values above</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">escapes_category</span><span class="plain">[2][128]; </span><span class="comment">one of the <code class="display"><span class="extract">*_ECAT</span></code> values above</span>
|
||||||
|
@ -84,7 +83,6 @@ because the loggers don't use format strings.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::log_escape_usage</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::log_escape_usage</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">cat</span><span class="plain"> < </span><span class="constant">2</span><span class="plain">; </span><span class="identifier">cat</span><span class="plain">++) {</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="identifier">cat</span><span class="plain"> < </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>§4. </b>That gives us a number of front doors:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>That gives us a number of front doors:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::register_writer</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">f</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">void</span><span class="plain"> *)) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::register_writer</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">f</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">void</span><span class="plain"> *)) {</span>
|
||||||
<span class="functiontext">Writers::register_writer_p</span><span class="plain">(0, </span><span class="identifier">esc</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">f</span><span class="plain">, </span><span class="constant">POINTER_ECAT</span><span class="plain">);</span>
|
<span class="functiontext">Writers::register_writer_p</span><span class="plain">(0, </span><span class="identifier">esc</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) </span><span class="identifier">f</span><span class="plain">, </span><span class="constant">POINTER_ECAT</span><span class="plain">);</span>
|
||||||
|
@ -140,7 +137,6 @@ because the loggers don't use format strings.)
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>All leading to:
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>All leading to:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::register_writer_p</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">set</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">f</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::register_writer_p</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">set</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">esc</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">f</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">escapes_registered</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">) </span><<span class="cwebmacro">Initialise the table of escapes</span> <span class="cwebmacronumber">5.1</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><<span class="cwebmacro">Initialise the table of escapes</span> <span class="cwebmacronumber">5.1</span>><span class="plain">;</span>
|
||||||
|
@ -201,7 +197,6 @@ for wide strings.
|
||||||
waiting for:
|
waiting for:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::printf</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">fmt</span><span class="plain">, ...) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Writers::printf</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">stream</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">fmt</span><span class="plain">, ...) {</span>
|
||||||
<span class="identifier">va_list</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">; </span><span class="comment">the variable argument list signified by the dots</span>
|
<span class="identifier">va_list</span><span class="plain"> </span><span class="identifier">ap</span><span class="plain">; </span><span class="comment">the variable argument list signified by the dots</span>
|
||||||
|
|
|
@ -73,7 +73,6 @@ different casing; and then repeat within that directory for the extension
|
||||||
file itself.
|
file itself.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">CIFilingSystem::fopen</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">mode</span><span class="plain">) {</span>
|
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">CIFilingSystem::fopen</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">mode</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">topdirpath</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">ciextdirpath</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">cistring</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">ciextname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">topdirpath</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">ciextdirpath</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">cistring</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">ciextname</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -279,7 +278,6 @@ return from the function.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">/Users/bobama/Library/Inform/Extensions/Hillary Clinton/Health Care.i7x</span>
|
<span class="plain">/Users/bobama/Library/Inform/Extensions/Hillary Clinton/Health Care.i7x</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -289,7 +287,6 @@ return from the function.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">topdirpath| is |/Users/bobama/Library/Inform/Extensions</span>
|
<span class="plain">topdirpath| is |/Users/bobama/Library/Inform/Extensions</span>
|
||||||
, and its casing is correct <span class="plain">ciextdirpath| is |Hillary Clinton</span>
|
, and its casing is correct <span class="plain">ciextdirpath| is |Hillary Clinton</span>
|
||||||
|
@ -346,7 +343,6 @@ that many contemporary implementations of <code class="display"><span class="ext
|
||||||
and in any case the code above contains much larger buffers than needed.)
|
and in any case the code above contains much larger buffers than needed.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CIFilingSystem::match_in_directory</span><span class="plain">(</span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vd</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CIFilingSystem::match_in_directory</span><span class="plain">(</span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vd</span><span class="plain">,</span>
|
||||||
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">last_match</span><span class="plain">) {</span>
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">last_match</span><span class="plain">) {</span>
|
||||||
|
@ -372,7 +368,6 @@ and in any case the code above contains much larger buffers than needed.)
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Non-POSIX tail. </b>On platforms without POSIX directory handling, we revert to regular <code class="display"><span class="extract">fopen</span></code>.
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Non-POSIX tail. </b>On platforms without POSIX directory handling, we revert to regular <code class="display"><span class="extract">fopen</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">CIFilingSystem::fopen</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">mode</span><span class="plain">) {</span>
|
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">CIFilingSystem::fopen</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">mode</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">fopen</span><span class="plain">(</span><span class="identifier">path</span><span class="plain">, </span><span class="identifier">mode</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">fopen</span><span class="plain">(</span><span class="identifier">path</span><span class="plain">, </span><span class="identifier">mode</span><span class="plain">);</span>
|
||||||
|
|
|
@ -36,7 +36,6 @@ a "bareword". For example, in
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">-log no-memory-usage -fixtime jam marmalade</span>
|
<span class="plain">-log no-memory-usage -fixtime jam marmalade</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -101,7 +100,6 @@ in <code class="display"><span class="extract">-help</span></code>. Groups are e
|
||||||
we'll hash the switch names into the following:
|
we'll hash the switch names into the following:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">cls_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">cls_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -114,7 +112,6 @@ A new <code class="display"><span class="extract">*_CLSW</span></code> value sho
|
||||||
swtich, and then the client should call:
|
swtich, and then the client should call:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_switch_group</span><span class="plain"> = -1;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">current_switch_group</span><span class="plain"> = -1;</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">switch_group_names</span><span class="plain">[</span><span class="identifier">NO_DEFINED_CLSG_VALUES</span><span class="plain">+1];</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">switch_group_names</span><span class="plain">[</span><span class="identifier">NO_DEFINED_CLSG_VALUES</span><span class="plain">+1];</span>
|
||||||
|
@ -193,7 +190,6 @@ section. So the sorting version of <code class="display"><span class="extract">n
|
||||||
<code class="display"><span class="extract">-no-destroy-world</span></code>:
|
<code class="display"><span class="extract">-no-destroy-world</span></code>:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">command_line_switch</span><span class="plain"> *</span><span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">,</span>
|
<span class="reserved">command_line_switch</span><span class="plain"> *</span><span class="functiontext">CommandLine::declare_boolean_switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">,</span>
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name_literal</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">help_literal</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">active</span><span class="plain">) {</span>
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">name_literal</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">help_literal</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">active</span><span class="plain">) {</span>
|
||||||
|
@ -317,7 +313,6 @@ through the file if one has by that point been provided.
|
||||||
holds the filename to read from.
|
holds the filename to read from.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">command_line_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">command_line_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::also_read_file</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::also_read_file</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
|
@ -335,7 +330,6 @@ might not exist as early as now, we have to record any log entries, and play
|
||||||
them back later (i.e., when the debugging log does exist).
|
them back later (i.e., when the debugging log does exist).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">command_line_logs</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">command_line_logs</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::record_log</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::record_log</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">) {</span>
|
||||||
|
@ -368,7 +362,6 @@ is equivalent to <code class="display"><span class="extract">-greet 'Fred Smith'
|
||||||
problem with internal space characters in arguments.
|
problem with internal space characters in arguments.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::read_file</span><span class="plain">(</span><span class="reserved">clf_reader_state</span><span class="plain"> *</span><span class="identifier">crs</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CommandLine::read_file</span><span class="plain">(</span><span class="reserved">clf_reader_state</span><span class="plain"> *</span><span class="identifier">crs</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">logline</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">logline</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
|
||||||
|
@ -428,7 +421,6 @@ problem with internal space characters in arguments.
|
||||||
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b>We also allow <code class="display"><span class="extract">-setting=X</span></code> as equivalent to <code class="display"><span class="extract">-setting X</span></code>.
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b>We also allow <code class="display"><span class="extract">-setting=X</span></code> as equivalent to <code class="display"><span class="extract">-setting X</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::read_pair</span><span class="plain">(</span><span class="reserved">clf_reader_state</span><span class="plain"> *</span><span class="identifier">crs</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::read_pair</span><span class="plain">(</span><span class="reserved">clf_reader_state</span><span class="plain"> *</span><span class="identifier">crs</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">opt_p</span><span class="plain">);</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">opt_p</span><span class="plain">);</span>
|
||||||
|
@ -459,7 +451,6 @@ problem with internal space characters in arguments.
|
||||||
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>So at this point we have definitely found what looks like a switch:
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b>So at this point we have definitely found what looks like a switch:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::read_pair_p</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt_val</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::read_pair_p</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt_val</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">,</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">,</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">,</span>
|
||||||
|
@ -577,7 +568,6 @@ bottom one. (Those are the dull ones.)
|
||||||
a brief description of the tool's name and purpose.
|
a brief description of the tool's name and purpose.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cls_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">cls_heading</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
|
||||||
|
@ -661,7 +651,6 @@ a brief description of the tool's name and purpose.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP15"></a><b>§15. </b></p>
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::compare_names</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CommandLine::compare_names</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent1</span><span class="plain">, </span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">ent2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tx1</span><span class="plain"> = (*((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">command_line_switch</span><span class="plain"> **) </span><span class="identifier">ent1</span><span class="plain">))-></span><span class="element">switch_sort_name</span><span class="plain">;</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">tx1</span><span class="plain"> = (*((</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">command_line_switch</span><span class="plain"> **) </span><span class="identifier">ent1</span><span class="plain">))-></span><span class="element">switch_sort_name</span><span class="plain">;</span>
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. </b>All of this abstracts the code already found in the platform definitions.
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. </b>All of this abstracts the code already found in the platform definitions.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">scan_directory</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">scan_directory</span><span class="plain"> {</span>
|
||||||
<span class="reserved">void</span><span class="plain"> *</span><span class="identifier">directory_handle</span><span class="plain">;</span>
|
<span class="reserved">void</span><span class="plain"> *</span><span class="identifier">directory_handle</span><span class="plain">;</span>
|
||||||
|
@ -47,7 +46,6 @@ whatever the locale encoding is; the filenames coming back have to be
|
||||||
transcoded the other way.
|
transcoded the other way.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="functiontext">Directories::open</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="functiontext">Directories::open</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">scan_directory</span><span class="plain">);</span>
|
<span class="reserved">scan_directory</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">scan_directory</span><span class="plain">);</span>
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
issued. If this returns <code class="display"><span class="extract">FALSE</span></code>, nothing is printed to <code class="display"><span class="extract">stderr</span></code>.
|
issued. If this returns <code class="display"><span class="extract">FALSE</span></code>, nothing is printed to <code class="display"><span class="extract">stderr</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> (*</span><span class="identifier">errors_handler</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">int</span><span class="plain">) = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> (*</span><span class="identifier">errors_handler</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">int</span><span class="plain">) = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
<span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">internal_errors_handler</span><span class="plain">)(</span><span class="reserved">void</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">int</span><span class="plain">) = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">void</span><span class="plain"> (*</span><span class="identifier">internal_errors_handler</span><span class="plain">)(</span><span class="reserved">void</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">char</span><span class="plain"> *, </span><span class="reserved">int</span><span class="plain">) = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -75,7 +74,6 @@ or streams systems, and therefore must be written with a little care to use
|
||||||
the temporary stream, not some other string which might need fresh allocation.
|
the temporary stream, not some other string which might need fresh allocation.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>
|
||||||
|
@ -155,7 +153,6 @@ occurs unexpectedly, and one way to do that is to force a division by zero.
|
||||||
(This is only enabled by <code class="display"><span class="extract">-crash</span></code> at the command line and is for debugging only.)
|
(This is only enabled by <code class="display"><span class="extract">-crash</span></code> at the command line and is for debugging only.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">debugger_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">debugger_mode</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::enter_debugger_mode</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::enter_debugger_mode</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
|
@ -185,7 +182,6 @@ occurs unexpectedly, and one way to do that is to force a division by zero.
|
||||||
specify this at three levels of abstraction:
|
specify this at three levels of abstraction:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::nowhere</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::nowhere</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="identifier">message</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
<span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="identifier">message</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
||||||
|
@ -217,7 +213,6 @@ specify this at three levels of abstraction:
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>Which funnel through:
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>Which funnel through:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::at_position</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">file</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">line</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::at_position</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">file</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">line</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>
|
||||||
|
@ -247,7 +242,6 @@ specify this at three levels of abstraction:
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Lastly:
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Lastly:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::with_file</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Errors::with_file</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ERM</span><span class="plain">)</span>
|
||||||
|
|
|
@ -34,7 +34,6 @@ are a single instance of the following. (Note that the text part is stored
|
||||||
as Unicode code points, regardless of what text encoding the locale has.)
|
as Unicode code points, regardless of what text encoding the locale has.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_location</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">pathname_of_location</span><span class="plain">;</span>
|
||||||
|
@ -50,7 +49,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Creation. </b>A filename is made by supplying a pathname and a leafname.
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Creation. </b>A filename is made by supplying a pathname and a leafname.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">file_name</span><span class="plain">) {</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">file_name</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::primitive</span><span class="plain">(</span><span class="identifier">file_name</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">file_name</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::primitive</span><span class="plain">(</span><span class="identifier">file_name</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">file_name</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
|
||||||
|
@ -78,7 +76,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Strings to filenames. </b>The following takes a textual name and returns a filename.
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Strings to filenames. </b>The following takes a textual name and returns a filename.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain"> = -1;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain"> = -1;</span>
|
||||||
|
@ -119,7 +116,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. The writer. </b>And conversely:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. The writer. </b>And conversely:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vF</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vF</span><span class="plain">) {</span>
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = (</span><span class="reserved">filename</span><span class="plain"> *) </span><span class="identifier">vF</span><span class="plain">;</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = (</span><span class="reserved">filename</span><span class="plain"> *) </span><span class="identifier">vF</span><span class="plain">;</span>
|
||||||
|
@ -142,7 +138,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>And again relative to a given pathname:
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>And again relative to a given pathname:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::to_text_relative</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::to_text_relative</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ft</span><span class="plain">);</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ft</span><span class="plain">);</span>
|
||||||
|
@ -165,7 +160,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Reading off the folder. </b></p>
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Reading off the folder. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Filenames::get_path_to</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Filenames::get_path_to</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -179,7 +173,6 @@ as Unicode code points, regardless of what text encoding the locale has.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Reading off the leafname. </b></p>
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Reading off the leafname. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::without_path</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Filenames::without_path</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">-></span><span class="element">leafname</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">-></span><span class="element">leafname</span><span class="plain">);</span>
|
||||||
|
@ -214,7 +207,6 @@ an accidental brush of the keyboard. Thus <code class="display"><span class="ext
|
||||||
as equivalent to <code class="display"><span class="extract">frog.jpg</span></code> when deciding the likely file format.
|
as equivalent to <code class="display"><span class="extract">frog.jpg</span></code> when deciding the likely file format.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::write_extension</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Filenames::write_extension</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">on</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">on</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
|
@ -316,7 +308,6 @@ that we must transcode the filename to whatever the locale expects before
|
||||||
we call <code class="display"><span class="extract">fopen</span></code>, which is the main reason for the wrapper.
|
we call <code class="display"><span class="extract">fopen</span></code>, which is the main reason for the wrapper.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">usage</span><span class="plain">) {</span>
|
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">usage</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_pathname</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
|
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_pathname</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
|
||||||
|
@ -348,7 +339,6 @@ compare two filenames by seeing if they have the same canonical form
|
||||||
when printed out.
|
when printed out.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Filenames::eq</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F1</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Filenames::eq</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F1</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F1</span><span class="plain"> == </span><span class="identifier">F2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">F1</span><span class="plain"> == </span><span class="identifier">F2</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
|
@ -369,7 +359,6 @@ when printed out.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Timestamps. </b></p>
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Timestamps. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Filenames::timestamp</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="identifier">time_t</span><span class="plain"> </span><span class="functiontext">Filenames::timestamp</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_pathname</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
|
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_pathname</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
|
||||||
|
|
|
@ -34,7 +34,6 @@ directory), and "filename" to mean a location of a file. For example:
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">/Users/rblackmore/Documents/Fireball</span>
|
<span class="plain">/Users/rblackmore/Documents/Fireball</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -44,7 +43,6 @@ directory), and "filename" to mean a location of a file. For example:
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">/Users/rblackmore/Documents/Fireball/whoosh.aiff</span>
|
<span class="plain">/Users/rblackmore/Documents/Fireball/whoosh.aiff</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -64,7 +62,6 @@ describe a folder which doesn't exist on disc.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">/Users/rblackmore/Documents/</span>
|
<span class="plain">/Users/rblackmore/Documents/</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -81,7 +78,6 @@ to begin with <code class="display"><span class="extract">FOLDER_SEPARATOR</span
|
||||||
host file system.
|
host file system.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">intermediate</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">intermediate</span><span class="plain">;</span>
|
||||||
|
@ -99,7 +95,6 @@ host file system.
|
||||||
<code class="display"><span class="extract">HOME</span></code>, if it exists.
|
<code class="display"><span class="extract">HOME</span></code>, if it exists.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">home_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">home_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::start</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
|
@ -118,7 +113,6 @@ host file system.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Installation folder. </b></p>
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Installation folder. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">installation_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">installation_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::set_installation_path</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::set_installation_path</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
|
@ -159,7 +153,6 @@ host file system.
|
||||||
then going one level deeper, using the supplied name.
|
then going one level deeper, using the supplied name.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">folder_name</span><span class="plain">) {</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">folder_name</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Pathnames::primitive</span><span class="plain">(</span><span class="identifier">folder_name</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">folder_name</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Pathnames::primitive</span><span class="plain">(</span><span class="identifier">folder_name</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">folder_name</span><span class="plain">), </span><span class="identifier">P</span><span class="plain">);</span>
|
||||||
|
@ -191,7 +184,6 @@ except possibly for an initial slash, so for example <code class="display"><span
|
||||||
<code class="display"><span class="extract">/paris/roubaix</span></code> is different.
|
<code class="display"><span class="extract">/paris/roubaix</span></code> is different.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Pathnames::from_text_relative</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">path</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Pathnames::from_text_relative</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">path</span><span class="plain">);</span>
|
||||||
|
@ -220,7 +212,6 @@ except possibly for an initial slash, so for example <code class="display"><span
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Writer. </b>Conversely, by the miracle of depth-first recursion:
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Writer. </b>Conversely, by the miracle of depth-first recursion:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vP</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vP</span><span class="plain">) {</span>
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = (</span><span class="reserved">pathname</span><span class="plain"> *) </span><span class="identifier">vP</span><span class="plain">;</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = (</span><span class="reserved">pathname</span><span class="plain"> *) </span><span class="identifier">vP</span><span class="plain">;</span>
|
||||||
|
@ -250,7 +241,6 @@ for example,
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">/Users/rblackmore/Documents/Fireball/tablature</span>
|
<span class="plain">/Users/rblackmore/Documents/Fireball/tablature</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -260,7 +250,6 @@ for example,
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">/Users/rblackmore/Documents/</span>
|
<span class="plain">/Users/rblackmore/Documents/</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -270,7 +259,6 @@ for example,
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">Fireball/tablature</span>
|
<span class="plain">Fireball/tablature</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -280,7 +268,6 @@ so it's probably not wise to use it with filenames typed in at the command
|
||||||
line.
|
line.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::to_text_relative</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::to_text_relative</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rt</span><span class="plain">);</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">rt</span><span class="plain">);</span>
|
||||||
|
@ -319,7 +306,6 @@ line.
|
||||||
on the file system with that path.
|
on the file system with that path.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">; </span><span class="comment">the root of the file system always exists</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">; </span><span class="comment">the root of the file system always exists</span>
|
||||||
|
@ -343,7 +329,6 @@ the <code class="display"><span class="extract">dest</span></code> tree an exact
|
||||||
anything different which was originally in <code class="display"><span class="extract">dest</span></code>).
|
anything different which was originally in <code class="display"><span class="extract">dest</span></code>).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::rsync</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">source</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">dest</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Pathnames::rsync</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">source</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">dest</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_source</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
|
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">transcoded_source</span><span class="plain">[4*</span><span class="constant">MAX_FILENAME_LENGTH</span><span class="plain">];</span>
|
||||||
|
|
|
@ -35,7 +35,6 @@ standard for POSIX, so will work on MacOS and Linux, but on a Windows system
|
||||||
they would need to be read in a POSIX-style environment like Cygwin.
|
they would need to be read in a POSIX-style environment like Cygwin.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::quote_path</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::quote_path</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">FN</span><span class="plain">);</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">FN</span><span class="plain">);</span>
|
||||||
|
@ -86,7 +85,6 @@ they would need to be read in a POSIX-style environment like Cygwin.
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The generic shell code to apply <code class="display"><span class="extract">command</span></code> to a file <code class="display"><span class="extract">F</span></code>:
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The generic shell code to apply <code class="display"><span class="extract">command</span></code> to a file <code class="display"><span class="extract">F</span></code>:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::apply</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">command</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::apply</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">command</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">COMMAND</span><span class="plain">)</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">COMMAND</span><span class="plain">)</span>
|
||||||
|
@ -115,7 +113,6 @@ they would need to be read in a POSIX-style environment like Cygwin.
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Applications to using <code class="display"><span class="extract">rm</span></code> and <code class="display"><span class="extract">cp</span></code>:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Applications to using <code class="display"><span class="extract">rm</span></code> and <code class="display"><span class="extract">cp</span></code>:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::rm</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::rm</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Shell::apply</span><span class="plain">(</span><span class="string">"rm"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
|
<span class="functiontext">Shell::apply</span><span class="plain">(</span><span class="string">"rm"</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
|
||||||
|
@ -143,7 +140,6 @@ they would need to be read in a POSIX-style environment like Cygwin.
|
||||||
from both <code class="display"><span class="extract">stdout</span></code> and <code class="display"><span class="extract">stderr</span></code> to the same named file.
|
from both <code class="display"><span class="extract">stdout</span></code> and <code class="display"><span class="extract">stderr</span></code> to the same named file.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::redirect</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Shell::redirect</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Shell::plain</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="string">">"</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">">"</span><span class="plain">);</span>
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Clock. </b>From the local environment, we'll extract the time at which we're running.
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Clock. </b>From the local environment, we'll extract the time at which we're running.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">time_t</span><span class="plain"> </span><span class="identifier">right_now</span><span class="plain">;</span>
|
<span class="identifier">time_t</span><span class="plain"> </span><span class="identifier">right_now</span><span class="plain">;</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">tm</span><span class="plain"> *</span><span class="identifier">the_present</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">tm</span><span class="plain"> *</span><span class="identifier">the_present</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -55,7 +54,6 @@ in one session with output generated another, even though that was on two
|
||||||
different dates.
|
different dates.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Time::fix</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Time::fix</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">tm</span><span class="plain"> </span><span class="identifier">start</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">tm</span><span class="plain"> </span><span class="identifier">start</span><span class="plain">;</span>
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Character classes. </b></p>
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Character classes. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Characters::tolower</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Characters::tolower</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="identifier">tolower</span><span class="plain">((</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> (</span><span class="identifier">wchar_t</span><span class="plain">) </span><span class="identifier">tolower</span><span class="plain">((</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">c</span><span class="plain">);</span>
|
||||||
|
@ -80,7 +79,6 @@
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>White space classes:
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>White space classes:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::is_space_or_tab</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::is_space_or_tab</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
|
@ -103,7 +101,6 @@ sense of the Treaty of Babel rules on leading and trailing spaces in
|
||||||
iFiction records.
|
iFiction records.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::is_babel_whitespace</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::is_babel_whitespace</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\x0a'</span><span class="plain">)</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\x0a'</span><span class="plain">)</span>
|
||||||
|
@ -120,7 +117,6 @@ iFiction records.
|
||||||
sufficient correctly to handle all characters in the ZSCII set.
|
sufficient correctly to handle all characters in the ZSCII set.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::combine_accent</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">accent</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">letter</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::combine_accent</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">accent</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">letter</span><span class="plain">) {</span>
|
||||||
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">accent</span><span class="plain">) {</span>
|
<span class="reserved">switch</span><span class="plain">(</span><span class="identifier">accent</span><span class="plain">) {</span>
|
||||||
|
@ -180,7 +176,6 @@ sufficient correctly to handle all characters in the ZSCII set.
|
||||||
the more obvious accents from it.
|
the more obvious accents from it.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::make_filename_safe</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::make_filename_safe</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain">) {</span>
|
||||||
<span class="identifier">charcode</span><span class="plain"> = </span><span class="functiontext">Characters::remove_accent</span><span class="plain">(</span><span class="identifier">charcode</span><span class="plain">);</span>
|
<span class="identifier">charcode</span><span class="plain"> = </span><span class="functiontext">Characters::remove_accent</span><span class="plain">(</span><span class="identifier">charcode</span><span class="plain">);</span>
|
||||||
|
@ -196,7 +191,6 @@ the more obvious accents from it.
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>The following strips the accent, if present, from an ISO Latin-1 character:
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>The following strips the accent, if present, from an ISO Latin-1 character:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::remove_accent</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Characters::remove_accent</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">charcode</span><span class="plain">) {</span>
|
||||||
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">charcode</span><span class="plain">) {</span>
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">charcode</span><span class="plain">) {</span>
|
||||||
|
|
|
@ -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>§2. </b>Occasionally we need access to the real, unbounded strlen:
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>Occasionally we need access to the real, unbounded strlen:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::strlen_unbounded</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::strlen_unbounded</span><span class="plain">(</span><span class="reserved">const</span><span class="plain"> </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">strlen</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">strlen</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
||||||
|
@ -72,7 +71,6 @@ result in a malformatted shell command being passed to the operating system,
|
||||||
which we cannot risk.
|
which we cannot risk.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::check_len</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::check_len</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain"> > </span><span class="constant">MAX_STRING_LENGTH</span><span class="plain">) || (</span><span class="identifier">n</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">)) </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"String overflow\n"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">n</span><span class="plain"> > </span><span class="constant">MAX_STRING_LENGTH</span><span class="plain">) || (</span><span class="identifier">n</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">)) </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"String overflow\n"</span><span class="plain">);</span>
|
||||||
|
@ -88,7 +86,6 @@ which we cannot risk.
|
||||||
non-terminated string, though this should never actually happen.
|
non-terminated string, though this should never actually happen.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::len</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::len</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">str</span><span class="plain">) {</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><=</span><span class="constant">MAX_STRING_LENGTH</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><=</span><span class="constant">MAX_STRING_LENGTH</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++)</span>
|
||||||
|
@ -106,7 +103,6 @@ non-terminated string, though this should never actually happen.
|
||||||
bounds-checked:
|
bounds-checked:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::copy</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::copy</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">CStrings::check_len</span><span class="plain">(</span><span class="functiontext">CStrings::len</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">));</span>
|
<span class="functiontext">CStrings::check_len</span><span class="plain">(</span><span class="functiontext">CStrings::len</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">));</span>
|
||||||
|
@ -123,7 +119,6 @@ bounds-checked:
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>String comparisons will be done with the following, not <code class="display"><span class="extract">strcmp</span></code> directly:
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>String comparisons will be done with the following, not <code class="display"><span class="extract">strcmp</span></code> directly:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::ne</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::ne</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> (</span><span class="functiontext">CStrings::cmp</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
|
<span class="reserved">return</span><span class="plain"> (</span><span class="functiontext">CStrings::cmp</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)?</span><span class="identifier">FALSE:TRUE</span><span class="plain">;</span>
|
||||||
|
@ -137,7 +132,6 @@ bounds-checked:
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>On the rare occasions when we need to sort alphabetically we'll also call:
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>On the rare occasions when we need to sort alphabetically we'll also call:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::cmp</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">CStrings::cmp</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">A</span><span class="plain">[0] == </span><span class="constant">0</span><span class="plain">)) {</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">A</span><span class="plain">[0] == </span><span class="constant">0</span><span class="plain">)) {</span>
|
||||||
|
@ -157,7 +151,6 @@ bounds-checked:
|
||||||
whose locale is encoded as UTF-8.
|
whose locale is encoded as UTF-8.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::transcode_ISO_string_to_UTF8</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">dest</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::transcode_ISO_string_to_UTF8</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">dest</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">;</span>
|
||||||
|
@ -185,7 +178,6 @@ result is therefore not a well-formed string and we have to fix matters by
|
||||||
hand. This I think makes for opaque code. So:
|
hand. This I think makes for opaque code. So:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::truncated_strcpy</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">CStrings::truncated_strcpy</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">max</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">;</span>
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
of line terminator will always be stripped out before this is applied.
|
of line terminator will always be stripped out before this is applied.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::white_space</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::white_space</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">' '</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'\t'</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
|
@ -49,7 +48,6 @@ C and has other meanings in other languages, but it's legal in C-for-Inform
|
||||||
identifiers.
|
identifiers.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::identifier_char</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::identifier_char</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'_'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">':'</span><span class="plain">) ||</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'_'</span><span class="plain">) || (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">':'</span><span class="plain">) ||</span>
|
||||||
|
@ -70,7 +68,6 @@ easily be done as a regular expression using <code class="display"><span class="
|
||||||
here is much quicker.
|
here is much quicker.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::find_expansion</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">on1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">on2</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::find_expansion</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">on1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">on2</span><span class="plain">,</span>
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">off1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">off2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">len</span><span class="plain">) {</span>
|
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">off1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">off2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">len</span><span class="plain">) {</span>
|
||||||
|
@ -93,7 +90,6 @@ here is much quicker.
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Still more simply:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Still more simply:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::find_open_brace</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::find_open_brace</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> < </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++)</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"> < </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">); </span><span class="identifier">i</span><span class="plain">++)</span>
|
||||||
|
@ -111,7 +107,6 @@ here is much quicker.
|
||||||
equivalent to <code class="display"><span class="extract">Regexp::match(p, " *")</span></code>, but much faster.
|
equivalent to <code class="display"><span class="extract">Regexp::match(p, " *")</span></code>, but much faster.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::string_is_white_space</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
||||||
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">)</span>
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">)</span>
|
||||||
|
@ -137,7 +132,6 @@ short texts against particularly simple patterns. Here is an example of use:
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">match_results mr = Regexp::create_mr();</span>
|
<span class="plain">match_results mr = Regexp::create_mr();</span>
|
||||||
<span class="plain">if (Regexp::match(&mr, text, L"fish (%d+) ([a-zA-Z_][a-zA-Z0-9_]*) *") {</span>
|
<span class="plain">if (Regexp::match(&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>§7. </b>The internal state of the matcher is stored as follows:
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>The internal state of the matcher is stored as follows:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_position</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_position</span><span class="plain"> {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tpos</span><span class="plain">; </span><span class="comment">position within text being matched</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">tpos</span><span class="plain">; </span><span class="comment">position within text being matched</span>
|
||||||
|
@ -212,6 +205,7 @@ are not. They are simply a little faster to access if short.
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_matched_texts</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_matched_texts</span><span class="plain">;</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_result</span><span class="plain"> </span><span class="identifier">exp_storage</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">];</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_result</span><span class="plain"> </span><span class="identifier">exp_storage</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">];</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">exp</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">];</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">exp</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">];</span>
|
||||||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">exp_at</span><span class="plain">[</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">];</span>
|
||||||
<span class="plain">} </span><span class="reserved">match_results</span><span class="plain">;</span>
|
<span class="plain">} </span><span class="reserved">match_results</span><span class="plain">;</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
|
@ -228,13 +222,14 @@ result strings grow very large), so that it's very quick to allocate and
|
||||||
deallocate.
|
deallocate.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">match_results</span><span class="plain"> </span><span class="functiontext">Regexp::create_mr</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="functiontext">Regexp::create_mr</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">;</span>
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">;</span>
|
||||||
<span class="identifier">mr</span><span class="plain">.</span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="identifier">mr</span><span class="plain">.</span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</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"><</span><span class="constant">MAX_BRACKETED_SUBEXPRESSIONS</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
||||||
<span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="identifier">mr</span><span class="plain">.</span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
<span class="identifier">mr</span><span class="plain">.</span><span class="element">exp_at</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = -1;</span>
|
||||||
|
<span class="plain">}</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">;</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain">;</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
|
|
||||||
|
@ -259,7 +254,6 @@ deallocate.
|
||||||
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>So, then: the matcher itself.
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>So, then: the matcher itself.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match</span><span class="plain">(</span><span class="reserved">match_results</span><span class="plain"> *</span><span class="identifier">mr</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match</span><span class="plain">(</span><span class="reserved">match_results</span><span class="plain"> *</span><span class="identifier">mr</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) </span><span class="functiontext">Regexp::prepare</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) </span><span class="functiontext">Regexp::prepare</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">);</span>
|
||||||
|
@ -268,10 +262,27 @@ deallocate.
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">rv</span><span class="plain">;</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
|
|
||||||
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match_from</span><span class="plain">(</span><span class="reserved">match_results</span><span class="plain"> *</span><span class="identifier">mr</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">,</span>
|
||||||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_partial</span><span class="plain">) {</span>
|
||||||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match_to</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
|
||||||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">x</span><span class="plain"> < </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">, &</span><span class="identifier">at</span><span class="plain">, </span><span class="identifier">allow_partial</span><span class="plain">);</span>
|
||||||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">match_to</span><span class="plain"> == -1) {</span>
|
||||||
|
<span class="identifier">match_to</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">;</span>
|
||||||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) </span><span class="functiontext">Regexp::dispose_of</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">);</span>
|
||||||
|
<span class="plain">}</span>
|
||||||
|
<span class="plain">}</span>
|
||||||
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">match_to</span><span class="plain"> - </span><span class="identifier">x</span><span class="plain">;</span>
|
||||||
|
<span class="plain">}</span>
|
||||||
|
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Regexp::prepare</span><span class="plain">(</span><span class="reserved">match_results</span><span class="plain"> *</span><span class="identifier">mr</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Regexp::prepare</span><span class="plain">(</span><span class="reserved">match_results</span><span class="plain"> *</span><span class="identifier">mr</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">) {</span>
|
||||||
<span class="identifier">mr</span><span class="plain">-></span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="identifier">mr</span><span class="plain">-></span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</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"><</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_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">-></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">-></span><span class="identifier">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">mr</span><span class="plain">-></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">-></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">-></span><span class="element">exp_storage</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="element">match_text_struct</span><span class="plain"> =</span>
|
<span class="identifier">mr</span><span class="plain">-></span><span class="element">exp_storage</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">].</span><span class="element">match_text_struct</span><span class="plain"> =</span>
|
||||||
<span class="functiontext">Streams::new_buffer</span><span class="plain">(</span>
|
<span class="functiontext">Streams::new_buffer</span><span class="plain">(</span>
|
||||||
|
@ -287,11 +298,12 @@ deallocate.
|
||||||
|
|
||||||
<p class="endnote">The function Regexp::match is used in 3/cla (<a href="3-cla.html#SP11">§11</a>, <a href="3-cla.html#SP12">§12</a>), 8/ws (<a href="8-ws.html#SP7_3_2">§7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">§7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">§7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_2_1">§7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">§7.2.2.3</a>), 8/bf (<a href="8-bf.html#SP3">§3</a>).</p>
|
<p class="endnote">The function Regexp::match is used in 3/cla (<a href="3-cla.html#SP11">§11</a>, <a href="3-cla.html#SP12">§12</a>), 8/ws (<a href="8-ws.html#SP7_3_2">§7.3.2</a>, <a href="8-ws.html#SP7_3_3_2">§7.3.3.2</a>, <a href="8-ws.html#SP7_3_3_2_1">§7.3.3.2.1</a>, <a href="8-ws.html#SP7_2_2_1">§7.2.2.1</a>, <a href="8-ws.html#SP7_2_2_3">§7.2.2.3</a>), 8/bf (<a href="8-bf.html#SP3">§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">§14</a>.</p>
|
<p class="endnote">The function Regexp::prepare is used in <a href="#SP14">§14</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b></p>
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match_r</span><span class="plain">(</span><span class="reserved">match_results</span><span class="plain"> *</span><span class="identifier">mr</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::match_r</span><span class="plain">(</span><span class="reserved">match_results</span><span class="plain"> *</span><span class="identifier">mr</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">,</span>
|
||||||
<span class="reserved">match_position</span><span class="plain"> *</span><span class="identifier">scan_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_partial</span><span class="plain">) {</span>
|
<span class="reserved">match_position</span><span class="plain"> *</span><span class="identifier">scan_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">allow_partial</span><span class="plain">) {</span>
|
||||||
|
@ -447,6 +459,7 @@ to implement numeric repetition counts, which we won't need:
|
||||||
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-></span><span class="element">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]);</span>
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-></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"> <= </span><span class="identifier">at</span><span class="plain">.</span><span class="identifier">brackets_end</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">j</span><span class="plain">++)</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">brackets_start</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">]; </span><span class="identifier">j</span><span class="plain"> <= </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">-></span><span class="identifier">exp</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">], </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
|
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">mr</span><span class="plain">-></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">-></span><span class="element">exp_at</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">] = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">brackets_start</span><span class="plain">[</span><span class="identifier">i</span><span class="plain">];</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
<span class="identifier">mr</span><span class="plain">-></span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">bc</span><span class="plain">;</span>
|
<span class="identifier">mr</span><span class="plain">-></span><span class="element">no_matched_texts</span><span class="plain"> = </span><span class="identifier">at</span><span class="plain">.</span><span class="element">bc</span><span class="plain">;</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
|
@ -514,9 +527,10 @@ is literal.
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
<span class="plain">*</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">; *</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">LITERAL_CLASS</span><span class="plain">;</span>
|
<span class="plain">*</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">; *</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">LITERAL_CLASS</span><span class="plain">;</span>
|
||||||
<span class="reserved">case</span><span class="plain"> </span><span class="character">'['</span><span class="plain">:</span>
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">'['</span><span class="plain">:</span>
|
||||||
<span class="plain">*</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">+2;</span>
|
<span class="plain">*</span><span class="identifier">from</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain">+1;</span>
|
||||||
|
<span class="identifier">ppos</span><span class="plain"> += </span><span class="constant">2</span><span class="plain">;</span>
|
||||||
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">pattern</span><span class="plain">[</span><span class="identifier">ppos</span><span class="plain">]) && (</span><span class="identifier">pattern</span><span class="plain">[</span><span class="identifier">ppos</span><span class="plain">] != </span><span class="character">']'</span><span class="plain">)) </span><span class="identifier">ppos</span><span class="plain">++;</span>
|
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">pattern</span><span class="plain">[</span><span class="identifier">ppos</span><span class="plain">]) && (</span><span class="identifier">pattern</span><span class="plain">[</span><span class="identifier">ppos</span><span class="plain">] != </span><span class="character">']'</span><span class="plain">)) </span><span class="identifier">ppos</span><span class="plain">++;</span>
|
||||||
<span class="plain">*</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain"> - </span><span class="constant">1</span><span class="plain">; *</span><span class="identifier">len</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain"> - *</span><span class="identifier">from</span><span class="plain"> + </span><span class="constant">1</span><span class="plain">;</span>
|
<span class="plain">*</span><span class="identifier">to</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain"> - </span><span class="constant">1</span><span class="plain">; *</span><span class="identifier">len</span><span class="plain"> = </span><span class="identifier">ppos</span><span class="plain"> - *</span><span class="identifier">from</span><span class="plain"> + </span><span class="constant">2</span><span class="plain">;</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="constant">LITERAL_CLASS</span><span class="plain">;</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="constant">LITERAL_CLASS</span><span class="plain">;</span>
|
||||||
<span class="reserved">case</span><span class="plain"> </span><span class="character">' '</span><span class="plain">:</span>
|
<span class="reserved">case</span><span class="plain"> </span><span class="character">' '</span><span class="plain">:</span>
|
||||||
<span class="plain">*</span><span class="identifier">len</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">WHITESPACE_CLASS</span><span class="plain">;</span>
|
<span class="plain">*</span><span class="identifier">len</span><span class="plain"> = </span><span class="constant">1</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">WHITESPACE_CLASS</span><span class="plain">;</span>
|
||||||
|
@ -531,7 +545,6 @@ is literal.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b></p>
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::test_cclass</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">chcl</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range_to</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">drawn_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reverse</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Regexp::test_cclass</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">chcl</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">range_to</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">drawn_from</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">reverse</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">match</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
|
@ -550,6 +563,9 @@ is literal.
|
||||||
<span class="plain">((</span><span class="identifier">c</span><span class="plain"> >= </span><span class="character">'a'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="character">'z'</span><span class="plain">)) ||</span>
|
<span class="plain">((</span><span class="identifier">c</span><span class="plain"> >= </span><span class="character">'a'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="character">'z'</span><span class="plain">)) ||</span>
|
||||||
<span class="plain">((</span><span class="identifier">c</span><span class="plain"> >= </span><span class="character">'0'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="character">'9'</span><span class="plain">))) </span><span class="identifier">match</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
<span class="plain">((</span><span class="identifier">c</span><span class="plain"> >= </span><span class="character">'0'</span><span class="plain">) && (</span><span class="identifier">c</span><span class="plain"> <= </span><span class="character">'9'</span><span class="plain">))) </span><span class="identifier">match</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
|
||||||
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LITERAL_CLASS:</span>
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">LITERAL_CLASS:</span>
|
||||||
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">range_to</span><span class="plain"> > </span><span class="identifier">range_from</span><span class="plain">) && (</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"> <= </span><span class="identifier">range_to</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain"> = </span><span class="identifier">range_from</span><span class="plain">; </span><span class="identifier">j</span><span class="plain"> <= </span><span class="identifier">range_to</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">++) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">], </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">c1</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">], </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">c1</span><span class="plain">;</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">j</span><span class="plain">+1 < </span><span class="identifier">range_to</span><span class="plain">) && (</span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+1] == </span><span class="character">'-'</span><span class="plain">)) { </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+2]; </span><span class="identifier">j</span><span class="plain"> += </span><span class="constant">2</span><span class="plain">; }</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">j</span><span class="plain">+1 < </span><span class="identifier">range_to</span><span class="plain">) && (</span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+1] == </span><span class="character">'-'</span><span class="plain">)) { </span><span class="identifier">c2</span><span class="plain"> = </span><span class="identifier">drawn_from</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">+2]; </span><span class="identifier">j</span><span class="plain"> += </span><span class="constant">2</span><span class="plain">; }</span>
|
||||||
|
@ -576,7 +592,6 @@ For example,
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">Regexp::replace(text, L"[aeiou]", L"!", REP_REPEATING);</span>
|
<span class="plain">Regexp::replace(text, L"[aeiou]", L"!", REP_REPEATING);</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
|
@ -63,7 +63,6 @@ here is just the size of the initial memory block, which is fastest to
|
||||||
access.
|
access.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::new</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::new_with_capacity</span><span class="plain">(32);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::new_with_capacity</span><span class="plain">(32);</span>
|
||||||
|
@ -93,7 +92,6 @@ we want the duplicate always to be writeable, so that <code class="display"><spa
|
||||||
duplicated as <code class="display"><span class="extract">NULL</span></code>.
|
duplicated as <code class="display"><span class="extract">NULL</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">E</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::new</span><span class="plain">();</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Str::new</span><span class="plain">();</span>
|
||||||
|
@ -115,7 +113,6 @@ with the capacity of the initial block large enough to hold the whole
|
||||||
thing plus a little extra, for efficiency's sake.
|
thing plus a little extra, for efficiency's sake.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
|
||||||
|
@ -155,7 +152,6 @@ thing plus a little extra, for efficiency's sake.
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>And sometimes we want to use an existing stream object:
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>And sometimes we want to use an existing stream object:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::from_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Str::from_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">c_string</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Streams::open_from_wide_string</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">c_string</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Streams::open_from_wide_string</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">c_string</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -176,7 +172,6 @@ thing plus a little extra, for efficiency's sake.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Converting to C strings. </b></p>
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Converting to C strings. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::copy_to_ISO_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::copy_to_ISO_string</span><span class="plain">(</span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">buffer_size</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Streams::write_as_ISO_string</span><span class="plain">(</span><span class="identifier">C_string</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">buffer_size</span><span class="plain">);</span>
|
<span class="functiontext">Streams::write_as_ISO_string</span><span class="plain">(</span><span class="identifier">C_string</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">, </span><span class="identifier">buffer_size</span><span class="plain">);</span>
|
||||||
|
@ -207,7 +202,6 @@ thing plus a little extra, for efficiency's sake.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Converting to integers. </b></p>
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Converting to integers. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">index</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">index</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain">[32];</span>
|
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">buffer</span><span class="plain">[32];</span>
|
||||||
|
@ -227,7 +221,6 @@ thing plus a little extra, for efficiency's sake.
|
||||||
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Length. </b>A puritan would return a <code class="display"><span class="extract">size_t</span></code> here, but I am not a puritan.
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Length. </b>A puritan would return a <code class="display"><span class="extract">size_t</span></code> here, but I am not a puritan.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Streams::get_position</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">Streams::get_position</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
|
||||||
|
@ -236,7 +229,7 @@ thing plus a little extra, for efficiency's sake.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">The function Str::len is used in <a href="#SP3">§3</a>, <a href="#SP7">§7</a>, <a href="#SP10">§10</a>, <a href="#SP11">§11</a>, <a href="#SP12">§12</a>, <a href="#SP13">§13</a>, <a href="#SP14">§14</a>, <a href="#SP15">§15</a>, <a href="#SP16">§16</a>, <a href="#SP18">§18</a>, <a href="#SP19">§19</a>, <a href="#SP20">§20</a>, <a href="#SP21">§21</a>, <a href="#SP23">§23</a>, <a href="#SP24">§24</a>, <a href="#SP25">§25</a>, 2/dl (<a href="2-dl.html#SP9">§9</a>), 3/cla (<a href="3-cla.html#SP13">§13</a>, <a href="3-cla.html#SP14">§14</a>, <a href="3-cla.html#SP14_1">§14.1</a>), 3/pth (<a href="3-pth.html#SP4">§4</a>, <a href="3-pth.html#SP5">§5</a>, <a href="3-pth.html#SP7">§7</a>), 3/fln (<a href="3-fln.html#SP2">§2</a>, <a href="3-fln.html#SP3">§3</a>, <a href="3-fln.html#SP5">§5</a>, <a href="3-fln.html#SP9">§9</a>), 4/taa (<a href="4-taa.html#SP2_1">§2.1</a>), 4/pm (<a href="4-pm.html#SP3">§3</a>, <a href="4-pm.html#SP4">§4</a>, <a href="4-pm.html#SP11_3">§11.3</a>, <a href="4-pm.html#SP14">§14</a>), 5/htm (<a href="5-htm.html#SP7">§7</a>, <a href="5-htm.html#SP15">§15</a>), 5/ee (<a href="5-ee.html#SP7_1">§7.1</a>, <a href="5-ee.html#SP7_2_3">§7.2.3</a>, <a href="5-ee.html#SP7_2_4">§7.2.4</a>), 7/vn (<a href="7-vn.html#SP7">§7</a>, <a href="7-vn.html#SP7_1">§7.1</a>, <a href="7-vn.html#SP10">§10</a>), 8/ws (<a href="8-ws.html#SP7_3">§7.3</a>, <a href="8-ws.html#SP7_3_3_1">§7.3.3.1</a>, <a href="8-ws.html#SP7_2_2_3_1">§7.2.2.3.1</a>, <a href="8-ws.html#SP7_2_2_4">§7.2.2.4</a>), 8/bdfw (<a href="8-bdfw.html#SP5">§5</a>, <a href="8-bdfw.html#SP6">§6</a>), 8/bf (<a href="8-bf.html#SP3">§3</a>, <a href="8-bf.html#SP4">§4</a>, <a href="8-bf.html#SP5">§5</a>, <a href="8-bf.html#SP6">§6</a>, <a href="8-bf.html#SP9">§9</a>).</p>
|
<p class="endnote">The function Str::len is used in <a href="#SP3">§3</a>, <a href="#SP7">§7</a>, <a href="#SP10">§10</a>, <a href="#SP11">§11</a>, <a href="#SP12">§12</a>, <a href="#SP13">§13</a>, <a href="#SP14">§14</a>, <a href="#SP15">§15</a>, <a href="#SP16">§16</a>, <a href="#SP18">§18</a>, <a href="#SP19">§19</a>, <a href="#SP20">§20</a>, <a href="#SP21">§21</a>, <a href="#SP23">§23</a>, <a href="#SP24">§24</a>, <a href="#SP25">§25</a>, 2/dl (<a href="2-dl.html#SP9">§9</a>), 3/cla (<a href="3-cla.html#SP13">§13</a>, <a href="3-cla.html#SP14">§14</a>, <a href="3-cla.html#SP14_1">§14.1</a>), 3/pth (<a href="3-pth.html#SP4">§4</a>, <a href="3-pth.html#SP5">§5</a>, <a href="3-pth.html#SP7">§7</a>), 3/fln (<a href="3-fln.html#SP2">§2</a>, <a href="3-fln.html#SP3">§3</a>, <a href="3-fln.html#SP5">§5</a>, <a href="3-fln.html#SP9">§9</a>), 4/taa (<a href="4-taa.html#SP2_1">§2.1</a>), 4/pm (<a href="4-pm.html#SP3">§3</a>, <a href="4-pm.html#SP4">§4</a>, <a href="4-pm.html#SP10">§10</a>, <a href="4-pm.html#SP11_3">§11.3</a>, <a href="4-pm.html#SP14">§14</a>), 5/htm (<a href="5-htm.html#SP7">§7</a>, <a href="5-htm.html#SP15">§15</a>), 5/ee (<a href="5-ee.html#SP7_1">§7.1</a>, <a href="5-ee.html#SP7_2_3">§7.2.3</a>, <a href="5-ee.html#SP7_2_4">§7.2.4</a>), 7/vn (<a href="7-vn.html#SP7">§7</a>, <a href="7-vn.html#SP7_1">§7.1</a>, <a href="7-vn.html#SP10">§10</a>), 8/ws (<a href="8-ws.html#SP7_3">§7.3</a>, <a href="8-ws.html#SP7_3_3_1">§7.3.3.1</a>, <a href="8-ws.html#SP7_2_2_3_1">§7.2.2.3.1</a>, <a href="8-ws.html#SP7_2_2_4">§7.2.2.4</a>), 8/bdfw (<a href="8-bdfw.html#SP5">§5</a>, <a href="8-bdfw.html#SP6">§6</a>), 8/bf (<a href="8-bf.html#SP3">§3</a>, <a href="8-bf.html#SP4">§4</a>, <a href="8-bf.html#SP5">§5</a>, <a href="8-bf.html#SP6">§6</a>, <a href="8-bf.html#SP9">§9</a>).</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Position markers. </b>A position marker is a lightweight way to refer to a particular position
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Position markers. </b>A position marker is a lightweight way to refer to a particular position
|
||||||
in a given string. Position 0 is before the first character; if, for
|
in a given string. Position 0 is before the first character; if, for
|
||||||
|
@ -246,7 +239,6 @@ but positive ones well past the end of the string are legal. (Doing things
|
||||||
at those positions may well not be, of course.)
|
at those positions may well not be, of course.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">string_position</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">string_position</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">;</span>
|
||||||
|
@ -261,7 +253,6 @@ at those positions may well not be, of course.)
|
||||||
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>You can then find a position in a given string thus:
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. </b>You can then find a position in a given string thus:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">string_position</span><span class="plain"> </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
<span class="reserved">string_position</span><span class="plain"> </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
||||||
<span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">; </span><span class="identifier">P</span><span class="plain">.</span><span class="element">S</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">; </span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
|
<span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">; </span><span class="identifier">P</span><span class="plain">.</span><span class="element">S</span><span class="plain"> = </span><span class="identifier">S</span><span class="plain">; </span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
|
||||||
|
@ -289,7 +280,6 @@ at those positions may well not be, of course.)
|
||||||
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>And you can step forwards or backwards:
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>And you can step forwards or backwards:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">string_position</span><span class="plain"> </span><span class="functiontext">Str::back</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="reserved">string_position</span><span class="plain"> </span><span class="functiontext">Str::back</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain">--; </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> > </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>§13. Character operations. </b>How to get at individual characters, then, now that we can refer to positions:
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. Character operations. </b>How to get at individual characters, then, now that we can refer to positions:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain">.</span><span class="element">S</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">P</span><span class="plain">.</span><span class="element">S</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> < </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>§14. </b></p>
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::put</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::put</span><span class="plain">(</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"wrote before start of string"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">.</span><span class="element">index</span><span class="plain"> < </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>§15. Truncation. </b></p>
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Truncation. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::clear</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
<span class="functiontext">Str::truncate</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
||||||
|
@ -427,7 +414,6 @@ at those positions may well not be, of course.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Copying. </b></p>
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Copying. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::concatenate</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::concatenate</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Streams::copy</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">S2</span><span class="plain">);</span>
|
<span class="functiontext">Streams::copy</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">S2</span><span class="plain">);</span>
|
||||||
|
@ -459,7 +445,6 @@ at those positions may well not be, of course.)
|
||||||
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>A subtly different operation is to set a string equal to a given C string:
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>A subtly different operation is to set a string equal to a given C string:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::copy_ISO_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::copy_ISO_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">C_string</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">);</span>
|
||||||
|
@ -488,7 +473,6 @@ at those positions may well not be, of course.)
|
||||||
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Comparisons. </b>We provide both case sensitive and insensitive versions.
|
<p class="inwebparagraph"><a id="SP18"></a><b>§18. Comparisons. </b>We provide both case sensitive and insensitive versions.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">) == </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">)) && (</span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">S2</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">) == </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">)) && (</span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">S2</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
|
@ -525,7 +509,6 @@ at those positions may well not be, of course.)
|
||||||
alphabetic sorting, like <code class="display"><span class="extract">strlen</span></code> in the C standard library.
|
alphabetic sorting, like <code class="display"><span class="extract">strlen</span></code> in the C standard library.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::cmp</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">), </span><span class="identifier">Q</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">);</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">), </span><span class="identifier">Q</span><span class="plain"> = </span><span class="functiontext">Str::start</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">);</span>
|
||||||
|
@ -560,7 +543,6 @@ alphabetic sorting, like <code class="display"><span class="extract">strlen</spa
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">Str::suffix_eq(I"wayzgoose", I"snow goose", N)</span>
|
<span class="plain">Str::suffix_eq(I"wayzgoose", I"snow goose", N)</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -572,7 +554,6 @@ alphabetic sorting, like <code class="display"><span class="extract">strlen</spa
|
||||||
for the staff of a publishing house.)
|
for the staff of a publishing house.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::prefix_eq</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::prefix_eq</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L1</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">), </span><span class="identifier">L2</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">);</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">L1</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">), </span><span class="identifier">L2</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">);</span>
|
||||||
|
@ -623,7 +604,6 @@ for the staff of a publishing house.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP21"></a><b>§21. </b></p>
|
<p class="inwebparagraph"><a id="SP21"></a><b>§21. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S1</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">S2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">) == (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcslen</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">)) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S1</span><span class="plain">) == (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcslen</span><span class="plain">(</span><span class="identifier">S2</span><span class="plain">)) {</span>
|
||||||
|
@ -660,7 +640,6 @@ for the staff of a publishing house.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP22"></a><b>§22. White space. </b></p>
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. White space. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::is_whitespace</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Str::is_whitespace</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
||||||
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">)</span>
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">S</span><span class="plain">)</span>
|
||||||
|
@ -677,7 +656,6 @@ for the staff of a publishing house.)
|
||||||
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>This removes spaces and tabs from both ends:
|
<p class="inwebparagraph"><a id="SP23"></a><b>§23. </b>This removes spaces and tabs from both ends:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">), </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">len</span><span class="plain"> = </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">), </span><span class="identifier">i</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">, </span><span class="identifier">j</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -741,7 +719,6 @@ for the staff of a publishing house.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP24"></a><b>§24. Deleting characters. </b></p>
|
<p class="inwebparagraph"><a id="SP24"></a><b>§24. Deleting characters. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::delete_first_character</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::delete_first_character</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Str::delete_nth_character</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
<span class="functiontext">Str::delete_nth_character</span><span class="plain">(</span><span class="identifier">S</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
||||||
|
@ -780,7 +757,6 @@ for the staff of a publishing house.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP25"></a><b>§25. Substrings. </b></p>
|
<p class="inwebparagraph"><a id="SP25"></a><b>§25. Substrings. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::substr</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Str::substr</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">string_position</span><span class="plain"> </span><span class="identifier">to</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">.</span><span class="element">S</span><span class="plain"> != </span><span class="identifier">to</span><span class="plain">.</span><span class="element">S</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"substr on two different strings"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">from</span><span class="plain">.</span><span class="element">S</span><span class="plain"> != </span><span class="identifier">to</span><span class="plain">.</span><span class="element">S</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"substr on two different strings"</span><span class="plain">);</span>
|
||||||
|
@ -853,7 +829,6 @@ a mutex. There's no real performance concern because the following routine
|
||||||
is run just once per I-literal in the source code, when the program starts up.
|
is run just once per I-literal in the source code, when the program starts up.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">string_literals_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">string_literals_dictionary</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
|
||||||
|
|
|
@ -348,7 +348,6 @@ it there.
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Single nodes are matched thus:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Single nodes are matched thus:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tries::matches</span><span class="plain">(</span><span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">pos</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Tries::matches</span><span class="plain">(</span><span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">pos</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">-></span><span class="element">match_character</span><span class="plain"> == </span><span class="constant">TRIE_ANYTHING</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain">-></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>§4. </b>Where:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>Where:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">match_trie</span><span class="plain"> *</span><span class="functiontext">Tries::new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">mc</span><span class="plain">) {</span>
|
<span class="reserved">match_trie</span><span class="plain"> *</span><span class="functiontext">Tries::new</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">mc</span><span class="plain">) {</span>
|
||||||
<span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">match_trie</span><span class="plain">);</span>
|
<span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">match_trie</span><span class="plain">);</span>
|
||||||
|
@ -410,7 +408,6 @@ start again with the next, and so on. Inform therefore often matches text
|
||||||
against a linked list of tries: we'll call that an "avinue".
|
against a linked list of tries: we'll call that an "avinue".
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_avinue</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_avinue</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">the_trie</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">match_trie</span><span class="plain"> *</span><span class="identifier">the_trie</span><span class="plain">;</span>
|
||||||
|
@ -426,7 +423,6 @@ against a linked list of tries: we'll call that an "avinue".
|
||||||
head node (of either sort).
|
head node (of either sort).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="functiontext">Tries::new_avinue</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from_start</span><span class="plain">) {</span>
|
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="functiontext">Tries::new_avinue</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">from_start</span><span class="plain">) {</span>
|
||||||
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain">);</span>
|
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain">);</span>
|
||||||
|
@ -451,7 +447,6 @@ head node (of either sort).
|
||||||
tries.
|
tries.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="functiontext">Tries::duplicate_avinue</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">) {</span>
|
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="functiontext">Tries::duplicate_avinue</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">) {</span>
|
||||||
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">FL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">, *</span><span class="identifier">FL</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -476,7 +471,6 @@ tries.
|
||||||
trie in turn until one matches (if it does).
|
trie in turn until one matches (if it does).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">Tries::search_avinue</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">Tries::search_avinue</span><span class="plain">(</span><span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -494,7 +488,6 @@ trie in turn until one matches (if it does).
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Logging. </b></p>
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Logging. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Tries::log_avinue</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vA</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Tries::log_avinue</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vA</span><span class="plain">) {</span>
|
||||||
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">match_avinue</span><span class="plain"> *) </span><span class="identifier">vA</span><span class="plain">;</span>
|
<span class="reserved">match_avinue</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">match_avinue</span><span class="plain"> *) </span><span class="identifier">vA</span><span class="plain">;</span>
|
||||||
|
|
|
@ -38,7 +38,6 @@ standard way to read in and iterate through lines of a text file.
|
||||||
file actually exists on disc at a given filename:
|
file actually exists on disc at a given filename:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">HANDLE</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span>
|
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">HANDLE</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span>
|
||||||
|
@ -55,7 +54,6 @@ file actually exists on disc at a given filename:
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Text file positions. </b>Here's how we record a position in a text file:
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Text file positions. </b>Here's how we record a position in a text file:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_file_position</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_file_position</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">text_file_filename</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">text_file_filename</span><span class="plain">;</span>
|
||||||
|
@ -75,7 +73,6 @@ file actually exists on disc at a given filename:
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>For access:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>For access:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::get_line_count</span><span class="plain">(</span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::get_line_count</span><span class="plain">(</span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tfp</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">tfp</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -90,7 +87,6 @@ file actually exists on disc at a given filename:
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>And this is for a real nowhere man:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>And this is for a real nowhere man:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_file_position</span><span class="plain"> </span><span class="functiontext">TextFiles::nowhere</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">text_file_position</span><span class="plain"> </span><span class="functiontext">TextFiles::nowhere</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_file_position</span><span class="plain"> </span><span class="identifier">tfp</span><span class="plain">;</span>
|
<span class="reserved">text_file_position</span><span class="plain"> </span><span class="identifier">tfp</span><span class="plain">;</span>
|
||||||
|
@ -113,7 +109,6 @@ we preserve a pointer called <code class="display"><span class="extract">state</
|
||||||
client.
|
client.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_oddities</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">serious</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_oddities</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">serious</span><span class="plain">,</span>
|
||||||
<span class="reserved">void</span><span class="plain"> (</span><span class="identifier">iterator</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">text_file_position</span><span class="plain"> *, </span><span class="reserved">void</span><span class="plain"> *),</span>
|
<span class="reserved">void</span><span class="plain"> (</span><span class="identifier">iterator</span><span class="plain">)(</span><span class="reserved">text_stream</span><span class="plain"> *, </span><span class="reserved">text_file_position</span><span class="plain"> *, </span><span class="reserved">void</span><span class="plain"> *),</span>
|
||||||
|
@ -272,7 +267,6 @@ Text files seldom come that large.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b></p>
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TextFiles::read_line</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_oddities</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TextFiles::read_line</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">escape_oddities</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
||||||
|
@ -303,7 +297,6 @@ Text files seldom come that large.
|
||||||
calling the following:
|
calling the following:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TextFiles::lose_interest</span><span class="plain">(</span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">TextFiles::lose_interest</span><span class="plain">(</span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
||||||
<span class="identifier">tfp</span><span class="plain">-></span><span class="element">actively_scanning</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="identifier">tfp</span><span class="plain">-></span><span class="element">actively_scanning</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
|
@ -339,7 +332,6 @@ check the return value for <code class="display"><span class="extract">EOF</span
|
||||||
might be at the start of the file being read.
|
might be at the start of the file being read.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">unicode_file_buffer</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">unicode_file_buffer</span><span class="plain"> {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">unicode_feed_buffer</span><span class="plain">[32]; </span><span class="comment">holds a single escape such as "[unicode 3106]"</span>
|
<span class="reserved">char</span><span class="plain"> </span><span class="identifier">unicode_feed_buffer</span><span class="plain">[32]; </span><span class="comment">holds a single escape such as "[unicode 3106]"</span>
|
||||||
|
|
|
@ -36,7 +36,6 @@ words instead of bytes. The character values should be Unicode code points.
|
||||||
wrappers simply abstract the standard C library's handling.
|
wrappers simply abstract the standard C library's handling.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::len</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::len</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcslen</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcslen</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">);</span>
|
||||||
|
@ -50,7 +49,6 @@ wrappers simply abstract the standard C library's handling.
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>On the rare occasions when we need to sort alphabetically we'll also call:
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>On the rare occasions when we need to sort alphabetically we'll also call:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::cmp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::cmp</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">wcscmp</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">wcscmp</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="identifier">B</span><span class="plain">);</span>
|
||||||
|
@ -63,7 +61,6 @@ wrappers simply abstract the standard C library's handling.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::atoi</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Wide::atoi</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">p</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcstol</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">10</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain">) </span><span class="identifier">wcstol</span><span class="plain">(</span><span class="identifier">p</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">10</span><span class="plain">);</span>
|
||||||
|
|
|
@ -47,7 +47,6 @@ of "volumes" (possibly only one), each of which is a series of "chapters"
|
||||||
essentially individual HTML files, plus some images.
|
essentially individual HTML files, plus some images.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">metadata_list</span><span class="plain">; </span><span class="comment">of <code class="display"><span class="extract">ebook_datum</span></code>: DCMI-standard bibliographic data</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">metadata_list</span><span class="plain">; </span><span class="comment">of <code class="display"><span class="extract">ebook_datum</span></code>: DCMI-standard bibliographic data</span>
|
||||||
|
@ -79,7 +78,6 @@ identify ebooks; we need to maintain a small dictionary, and so small that a
|
||||||
list is entirely sufficient.
|
list is entirely sufficient.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_datum</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_datum</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">;</span>
|
||||||
|
@ -95,7 +93,6 @@ list is entirely sufficient.
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>As noted above, we use the following to stratify the book:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>As noted above, we use the following to stratify the book:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_volume</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_volume</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">volume_title</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">volume_title</span><span class="plain">;</span>
|
||||||
|
@ -124,7 +121,6 @@ list is entirely sufficient.
|
||||||
pages:
|
pages:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_page</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">ebook_page</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">page_title</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">page_title</span><span class="plain">;</span>
|
||||||
|
@ -163,7 +159,6 @@ pages:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Creation. </b></p>
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Creation. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">ebook</span><span class="plain"> *</span><span class="functiontext">Epub::new</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">prefix</span><span class="plain">) {</span>
|
<span class="reserved">ebook</span><span class="plain"> *</span><span class="functiontext">Epub::new</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">prefix</span><span class="plain">) {</span>
|
||||||
<span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain">);</span>
|
<span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain">);</span>
|
||||||
|
@ -306,7 +301,6 @@ image separately. (This is a little inconvenient, but indoc wants to do it
|
||||||
that way.)
|
that way.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Epub::begin_construction</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">cover_image</span><span class="plain">) {</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="functiontext">Epub::begin_construction</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">cover_image</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Pathnames::create_in_file_system</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -430,7 +424,6 @@ images" at the ThreePress Consulting blog.)
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b></p>
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Epub::end_construction</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Epub::end_construction</span><span class="plain">(</span><span class="reserved">ebook</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
||||||
<<span class="cwebmacro">Attach default metadata</span> <span class="cwebmacronumber">7.1</span>><span class="plain">;</span>
|
<<span class="cwebmacro">Attach default metadata</span> <span class="cwebmacronumber">7.1</span>><span class="plain">;</span>
|
||||||
|
|
|
@ -45,7 +45,6 @@ this auditing. To do that, we atach an <code class="display"><span class="extrac
|
||||||
text stream.
|
text stream.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">HTML_file_state</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">HTML_file_state</span><span class="plain"> {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">XHTML_flag</span><span class="plain">; </span><span class="comment">writing strict XHTML for use in epubs</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">XHTML_flag</span><span class="plain">; </span><span class="comment">writing strict XHTML for use in epubs</span>
|
||||||
|
@ -76,7 +75,6 @@ and in the right order. Thus we can't open body, open div, close body, because
|
||||||
that would be a div tag which was pushed but not pulled.
|
that would be a div tag which was pushed but not pulled.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unique_xref</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">unique_xref</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">HTML_tag</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">HTML_tag</span><span class="plain"> {</span>
|
||||||
|
@ -106,7 +104,6 @@ that would be a div tag which was pushed but not pulled.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b></p>
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::pop_tag</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::pop_tag</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">) {</span>
|
||||||
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
||||||
|
@ -134,7 +131,6 @@ that would be a div tag which was pushed but not pulled.
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>At the end, therefore, no tags must remain unpulled.
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>At the end, therefore, no tags must remain unpulled.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::completed</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::completed</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
||||||
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
||||||
|
@ -188,7 +184,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Which themselves depend on these routines:
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>Which themselves depend on these routines:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">details</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::tag</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">details</span><span class="plain">) {</span>
|
||||||
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<%s"</span><span class="plain">, </span><span class="identifier">tag</span><span class="plain">);</span>
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<%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>§8. Head. </b></p>
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Head. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_head</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">CSS_file</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_head</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">CSS_file</span><span class="plain">) {</span>
|
||||||
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
<span class="reserved">HTML_file_state</span><span class="plain"> *</span><span class="identifier">hs</span><span class="plain"> = </span><span class="functiontext">Streams::get_HTML_file_state</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">);</span>
|
||||||
|
@ -302,7 +296,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b></p>
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::title</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::title</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">title</span><span class="plain">) {</span>
|
||||||
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"title"</span><span class="plain">);</span>
|
<span class="identifier">HTML_OPEN</span><span class="plain">(</span><span class="string">"title"</span><span class="plain">);</span>
|
||||||
|
@ -317,7 +310,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Scripts and styles. </b></p>
|
<p class="inwebparagraph"><a id="SP10"></a><b>§10. Scripts and styles. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::open_javascript</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">define_project</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::open_javascript</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">define_project</span><span class="plain">) {</span>
|
||||||
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"script"</span><span class="plain">, </span><span class="string">"type=\"text/javascript\""</span><span class="plain">);</span>
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"script"</span><span class="plain">, </span><span class="string">"type=\"text/javascript\""</span><span class="plain">);</span>
|
||||||
|
@ -392,7 +384,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>The helper simply performs a textual copy:
|
<p class="inwebparagraph"><a id="SP11"></a><b>§11. </b>The helper simply performs a textual copy:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::incorporate_helper</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line_of_template</span><span class="plain">,</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::incorporate_helper</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line_of_template</span><span class="plain">,</span>
|
||||||
<span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">) {</span>
|
<span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">) {</span>
|
||||||
|
@ -406,7 +397,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Body. </b></p>
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. Body. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_body</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">class</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_body</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">class</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">class</span><span class="plain">) </span><span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"body"</span><span class="plain">, </span><span class="string">"class=\"%S\""</span><span class="plain">, </span><span class="identifier">class</span><span class="plain">)</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">class</span><span class="plain">) </span><span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"body"</span><span class="plain">, </span><span class="string">"class=\"%S\""</span><span class="plain">, </span><span class="identifier">class</span><span class="plain">)</span>
|
||||||
|
@ -427,7 +417,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP13"></a><b>§13. Divisions. </b></p>
|
<p class="inwebparagraph"><a id="SP13"></a><b>§13. Divisions. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_div_with_id</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_div_with_id</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
|
||||||
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"div"</span><span class="plain">, </span><span class="string">"id=\"%s\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"div"</span><span class="plain">, </span><span class="string">"id=\"%s\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">);</span>
|
||||||
|
@ -487,7 +476,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Images. </b></p>
|
<p class="inwebparagraph"><a id="SP14"></a><b>§14. Images. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::image</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::image</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="identifier">HTML_TAG_WITH</span><span class="plain">(</span><span class="string">"img"</span><span class="plain">, </span><span class="string">"src=\"%/f\""</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
|
<span class="identifier">HTML_TAG_WITH</span><span class="plain">(</span><span class="string">"img"</span><span class="plain">, </span><span class="string">"src=\"%/f\""</span><span class="plain">, </span><span class="identifier">F</span><span class="plain">);</span>
|
||||||
|
@ -500,7 +488,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Links. </b></p>
|
<p class="inwebparagraph"><a id="SP15"></a><b>§15. Links. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::anchor</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::anchor</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">id</span><span class="plain">) {</span>
|
||||||
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">, </span><span class="string">"id=\"%S\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">);</span>
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">, </span><span class="string">"id=\"%S\""</span><span class="plain">, </span><span class="identifier">id</span><span class="plain">); </span><span class="identifier">HTML_CLOSE</span><span class="plain">(</span><span class="string">"a"</span><span class="plain">);</span>
|
||||||
|
@ -554,7 +541,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Tables. </b>Opening a generic bland table with reasonable column spacing:
|
<p class="inwebparagraph"><a id="SP16"></a><b>§16. Tables. </b>Opening a generic bland table with reasonable column spacing:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_plain_html_table</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_plain_html_table</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">) {</span>
|
||||||
<span class="functiontext">HTML::begin_html_table</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
<span class="functiontext">HTML::begin_html_table</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">, </span><span class="constant">0</span><span class="plain">);</span>
|
||||||
|
@ -574,7 +560,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>And some more general code:
|
<p class="inwebparagraph"><a id="SP17"></a><b>§17. </b>And some more general code:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_html_table</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">colour</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">full_width</span><span class="plain">,</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_html_table</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">colour</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">full_width</span><span class="plain">,</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">border</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cellspacing</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cellpadding</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">height</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">width</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">border</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cellspacing</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cellpadding</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">height</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">width</span><span class="plain">) {</span>
|
||||||
|
@ -792,7 +777,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP19"></a><b>§19. Miscellaneous. </b></p>
|
<p class="inwebparagraph"><a id="SP19"></a><b>§19. Miscellaneous. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::comment</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
||||||
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<!--%S-->\n"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
|
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"<!--%S-->\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>§20. HTML colours. </b>Inform uses these when constructing the map in the World index.
|
<p class="inwebparagraph"><a id="SP20"></a><b>§20. HTML colours. </b>Inform uses these when constructing the map in the World index.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colour_translation</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">colour_translation</span><span class="plain"> {</span>
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">chip_name</span><span class="plain">;</span>
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">chip_name</span><span class="plain">;</span>
|
||||||
|
@ -985,7 +968,6 @@ of which are variadic and have to be written out the old-fashioned way:
|
||||||
need to run quickly.
|
need to run quickly.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">HTML::translate_colour_name</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">original</span><span class="plain">) {</span>
|
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="functiontext">HTML::translate_colour_name</span><span class="plain">(</span><span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">original</span><span class="plain">) {</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="functiontext">Wide::cmp</span><span class="plain">(</span><span class="identifier">table_of_translations</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">].</span><span class="element">chip_name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">""</span><span class="plain">); </span><span class="identifier">j</span><span class="plain">++)</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">j</span><span class="plain">=0; </span><span class="functiontext">Wide::cmp</span><span class="plain">(</span><span class="identifier">table_of_translations</span><span class="plain">[</span><span class="identifier">j</span><span class="plain">].</span><span class="element">chip_name</span><span class="plain">, </span><span class="identifier">L</span><span class="string">""</span><span class="plain">); </span><span class="identifier">j</span><span class="plain">++)</span>
|
||||||
|
@ -1001,7 +983,6 @@ need to run quickly.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP22"></a><b>§22. </b></p>
|
<p class="inwebparagraph"><a id="SP22"></a><b>§22. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_colour</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">col</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">HTML::begin_colour</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">col</span><span class="plain">) {</span>
|
||||||
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"style=\"color:#%S\""</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">);</span>
|
<span class="identifier">HTML_OPEN_WITH</span><span class="plain">(</span><span class="string">"span"</span><span class="plain">, </span><span class="string">"style=\"color:#%S\""</span><span class="plain">, </span><span class="identifier">col</span><span class="plain">);</span>
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
arranged with most significant byte (MSB) first.
|
arranged with most significant byte (MSB) first.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_int8</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_int8</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">getc</span><span class="plain">(</span><span class="identifier">binary_file</span><span class="plain">);</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = </span><span class="identifier">getc</span><span class="plain">(</span><span class="identifier">binary_file</span><span class="plain">);</span>
|
||||||
|
@ -106,7 +105,6 @@ arranged with most significant byte (MSB) first.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::write_int32</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::write_int32</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) ((</span><span class="identifier">val</span><span class="plain"> >> </span><span class="constant">24</span><span class="plain">) & </span><span class="constant">0xFF</span><span class="plain">);</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain"> = (</span><span class="reserved">int</span><span class="plain">) ((</span><span class="identifier">val</span><span class="plain"> >> </span><span class="constant">24</span><span class="plain">) & </span><span class="constant">0xFF</span><span class="plain">);</span>
|
||||||
|
@ -130,7 +128,6 @@ arranged with most significant byte (MSB) first.
|
||||||
integers 32 or 64 bits wide:
|
integers 32 or 64 bits wide:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BinaryFiles::swap_bytes32</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BinaryFiles::swap_bytes32</span><span class="plain">(</span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">value</span><span class="plain">) {</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = (((*</span><span class="identifier">value</span><span class="plain"> & </span><span class="constant">0xff</span><span class="plain">) << </span><span class="constant">24</span><span class="plain">) +</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">result</span><span class="plain"> = (((*</span><span class="identifier">value</span><span class="plain"> & </span><span class="constant">0xff</span><span class="plain">) << </span><span class="constant">24</span><span class="plain">) +</span>
|
||||||
|
@ -165,7 +162,6 @@ of data plus a most significant bit which marks that a continuation byte
|
||||||
follows:
|
follows:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_variable_length_integer</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_variable_length_integer</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain">;</span>
|
||||||
|
@ -189,7 +185,6 @@ follows:
|
||||||
floating-point numbers:
|
floating-point numbers:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_float80</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_float80</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">result</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain">, </span><span class="identifier">c2</span><span class="plain">, </span><span class="identifier">exp</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c1</span><span class="plain">, </span><span class="identifier">c2</span><span class="plain">, </span><span class="identifier">exp</span><span class="plain">;</span>
|
||||||
|
@ -221,7 +216,6 @@ then null terminate it to make it valid C string. (<code class="display"><span c
|
||||||
be at least <code class="display"><span class="extract">length</span></code> plus 1 bytes long.)
|
be at least <code class="display"><span class="extract">length</span></code> plus 1 bytes long.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_string</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">string</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::read_string</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">binary_file</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">string</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">length</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">length</span><span class="plain"> > </span><span class="constant">0</span><span class="plain">) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">length</span><span class="plain"> > </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>§7. Size. </b></p>
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Size. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::size</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">long</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::size</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">TEST_FILE</span><span class="plain"> = </span><span class="functiontext">BinaryFiles::try_to_open_for_reading</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
|
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">TEST_FILE</span><span class="plain"> = </span><span class="functiontext">BinaryFiles::try_to_open_for_reading</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">);</span>
|
||||||
|
@ -262,7 +255,6 @@ be at least <code class="display"><span class="extract">length</span></code> plu
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Opening. </b></p>
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Opening. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">BinaryFiles::open_for_reading</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">FILE</span><span class="plain"> *</span><span class="functiontext">BinaryFiles::open_for_reading</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">handle</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span>
|
<span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">handle</span><span class="plain"> = </span><span class="functiontext">Filenames::fopen</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="string">"rb"</span><span class="plain">);</span>
|
||||||
|
@ -305,7 +297,6 @@ be at least <code class="display"><span class="extract">length</span></code> plu
|
||||||
or to system APIs.
|
or to system APIs.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::copy</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_error</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BinaryFiles::copy</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">suppress_error</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">from</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">to</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
|
||||||
|
|
|
@ -47,7 +47,6 @@ actual image: this can have many forms, but in all cases tells us the
|
||||||
height and width.
|
height and width.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ImageFiles::get_JPEG_dimensions</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">JPEG_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">width</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">height</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ImageFiles::get_JPEG_dimensions</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">JPEG_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">width</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">height</span><span class="plain">) {</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sig</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">;</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sig</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">;</span>
|
||||||
|
@ -106,7 +105,6 @@ need to scan the IHDR chunk, of which the pixel width and height are the
|
||||||
first two words (section 11.2.2).
|
first two words (section 11.2.2).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ImageFiles::get_PNG_dimensions</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">PNG_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">width</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">height</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">ImageFiles::get_PNG_dimensions</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">PNG_file</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">width</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">height</span><span class="plain">) {</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sig1</span><span class="plain">, </span><span class="identifier">sig2</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">, </span><span class="identifier">type</span><span class="plain">;</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">sig1</span><span class="plain">, </span><span class="identifier">sig2</span><span class="plain">, </span><span class="identifier">length</span><span class="plain">, </span><span class="identifier">type</span><span class="plain">;</span>
|
||||||
|
|
|
@ -33,7 +33,6 @@ explicate the following, see the specifications for AIFF and OGG headers.
|
||||||
Durations are measured in centiseconds.
|
Durations are measured in centiseconds.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_AIFF_duration</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pDuration</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_AIFF_duration</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pDuration</span><span class="plain">,</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pBitsPerSecond</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pChannels</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pSampleRate</span><span class="plain">) {</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pBitsPerSecond</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pChannels</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pSampleRate</span><span class="plain">) {</span>
|
||||||
|
@ -86,7 +85,6 @@ Durations are measured in centiseconds.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. OGG Vorbis files. </b></p>
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. OGG Vorbis files. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_OggVorbis_duration</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pDuration</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_OggVorbis_duration</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pDuration</span><span class="plain">,</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pBitsPerSecond</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pChannels</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pSampleRate</span><span class="plain">) {</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pBitsPerSecond</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pChannels</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pSampleRate</span><span class="plain">) {</span>
|
||||||
|
@ -215,7 +213,6 @@ compiles for will allow. At present, the Glulx virtual machine does not
|
||||||
officially support MIDI, which makes the question moot.
|
officially support MIDI, which makes the question moot.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_MIDI_information</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pType</span><span class="plain">,</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">SoundFiles::get_MIDI_information</span><span class="plain">(</span><span class="reserved">FILE</span><span class="plain"> *</span><span class="identifier">pFile</span><span class="plain">, </span><span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pType</span><span class="plain">,</span>
|
||||||
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pNumTracks</span><span class="plain">) {</span>
|
<span class="reserved">unsigned</span><span class="plain"> </span><span class="reserved">int</span><span class="plain"> *</span><span class="identifier">pNumTracks</span><span class="plain">) {</span>
|
||||||
|
|
|
@ -62,7 +62,6 @@ time of the Reykjavik summit between Presidents Gorbachev and Reagan:
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="plain">Moonmist</span>
|
<span class="plain">Moonmist</span>
|
||||||
<span class="plain">Infocom interactive fiction - a mystery story</span>
|
<span class="plain">Infocom interactive fiction - a mystery story</span>
|
||||||
|
@ -126,7 +125,6 @@ Instead they are used to represent the absence of a version number.
|
||||||
(In particular, a string of <code class="display"><span class="extract">-1</span></code>s is null.)
|
(In particular, a string of <code class="display"><span class="extract">-1</span></code>s is null.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="functiontext">VersionNumbers::null</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="functiontext">VersionNumbers::null</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">push</span>
|
<span class="plain">#</span><span class="identifier">pragma</span><span class="plain"> </span><span class="identifier">clang</span><span class="plain"> </span><span class="identifier">diagnostic</span><span class="plain"> </span><span class="identifier">push</span>
|
||||||
|
@ -159,7 +157,6 @@ Instead they are used to represent the absence of a version number.
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Printing and parsing. </b>Printing is simple enough:
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Printing and parsing. </b>Printing is simple enough:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumbers::to_text</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumbers::to_text</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"null"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VersionNumbers::is_null</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">)) { </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"null"</span><span class="plain">); </span><span class="reserved">return</span><span class="plain">; }</span>
|
||||||
|
@ -189,7 +186,6 @@ variadic macros are not carefully enough type-checked by <code class="display"><
|
||||||
to catch this sort of slip.
|
to catch this sort of slip.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumbers::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vE</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumbers::writer</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> *</span><span class="identifier">format_string</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">vE</span><span class="plain">) {</span>
|
||||||
<span class="reserved">semantic_version_number</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = (</span><span class="reserved">semantic_version_number</span><span class="plain"> *) </span><span class="identifier">vE</span><span class="plain">;</span>
|
<span class="reserved">semantic_version_number</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = (</span><span class="reserved">semantic_version_number</span><span class="plain"> *) </span><span class="identifier">vE</span><span class="plain">;</span>
|
||||||
|
@ -303,7 +299,6 @@ of digits only, and alphabetically otherwise; and finally the number of
|
||||||
prerelease elements. Build metadata is disregarded entirely.
|
prerelease elements. Build metadata is disregarded entirely.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="constant">SEMVER_NUMBER_DEPTH</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">i</span><span class="plain">=0; </span><span class="identifier">i</span><span class="plain"><</span><span class="constant">SEMVER_NUMBER_DEPTH</span><span class="plain">; </span><span class="identifier">i</span><span class="plain">++) {</span>
|
||||||
|
@ -346,7 +341,6 @@ prerelease elements. Build metadata is disregarded entirely.
|
||||||
as if they were 0:
|
as if they were 0:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::floor</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::floor</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> < </span><span class="constant">0</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -363,7 +357,6 @@ otherwise. If the value has more than about 10 digits, then the result will
|
||||||
not be meaningful, which I think is a technical violation of the standard.
|
not be meaningful, which I think is a technical violation of the standard.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::strict_atoi</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::strict_atoi</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span>
|
||||||
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">)</span>
|
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">pos</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">)</span>
|
||||||
|
@ -385,7 +378,6 @@ These are trichotomous, that is, for each pair <code class="display"><span class
|
||||||
is true.
|
is true.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::eq</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::eq</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="identifier">V1</span><span class="plain">, </span><span class="identifier">V2</span><span class="plain">)) && (</span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="identifier">V2</span><span class="plain">, </span><span class="identifier">V1</span><span class="plain">)))</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">VersionNumbers::le</span><span class="plain">(</span><span class="identifier">V1</span><span class="plain">, </span><span class="identifier">V2</span><span class="plain">)) && (</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>§12. </b>And the following can be used for sorting, following the <code class="display"><span class="extract">strcmp</span></code> convention.
|
<p class="inwebparagraph"><a id="SP12"></a><b>§12. </b>And the following can be used for sorting, following the <code class="display"><span class="extract">strcmp</span></code> convention.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::cmp</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumbers::cmp</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V1</span><span class="plain">, </span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VersionNumbers::eq</span><span class="plain">(</span><span class="identifier">V1</span><span class="plain">, </span><span class="identifier">V2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">VersionNumbers::eq</span><span class="plain">(</span><span class="identifier">V1</span><span class="plain">, </span><span class="identifier">V2</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
|
|
@ -73,7 +73,6 @@ no sense for an interval to be empty seen from one end but not the other.
|
||||||
and <code class="display"><span class="extract">)</span></code> for open ones.
|
and <code class="display"><span class="extract">)</span></code> for open ones.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::write_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no range"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no range"</span><span class="plain">);</span>
|
||||||
|
@ -99,7 +98,6 @@ and <code class="display"><span class="extract">)</span></code> for open ones.
|
||||||
number lies in this range.
|
number lies in this range.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">semver_range</span><span class="plain">);</span>
|
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">semver_range</span><span class="plain">);</span>
|
||||||
|
@ -138,7 +136,6 @@ alphanumeric string gives it lower precendence than all other prerelease
|
||||||
versions.
|
versions.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::compatibility_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
|
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::compatibility_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
|
||||||
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span>
|
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span>
|
||||||
|
@ -164,7 +161,6 @@ versions.
|
||||||
inclusive:
|
inclusive:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::at_least_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
|
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="functiontext">VersionNumberRanges::at_least_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">) {</span>
|
||||||
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span>
|
<span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::any_range</span><span class="plain">();</span>
|
||||||
|
@ -190,7 +186,6 @@ inclusive:
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>Here we test whether V is at least a given end, and then at most:
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>Here we test whether V is at least a given end, and then at most:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::version_ge_end</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::version_ge_end</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E</span><span class="plain">) {</span>
|
||||||
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">end_type</span><span class="plain">) {</span>
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">E</span><span class="plain">.</span><span class="identifier">end_type</span><span class="plain">) {</span>
|
||||||
|
@ -234,7 +229,6 @@ inclusive:
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>This allows a simple way to write:
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b>This allows a simple way to write:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::in_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::in_range</span><span class="plain">(</span><span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">R</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
|
@ -264,7 +258,6 @@ upper end of <code class="display"><span class="extract">[..., 4]</span></code>
|
||||||
the boundary value is the same, open ends are stricter than closed ends.
|
the boundary value is the same, open ends are stricter than closed ends.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::stricter</span><span class="plain">(</span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E1</span><span class="plain">, </span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">lower</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::stricter</span><span class="plain">(</span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E1</span><span class="plain">, </span><span class="reserved">range_end</span><span class="plain"> </span><span class="identifier">E2</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">lower</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">E1</span><span class="plain">.</span><span class="element">end_type</span><span class="plain"> == </span><span class="constant">EMPTY_RANGE_END</span><span class="plain">) && (</span><span class="identifier">E2</span><span class="plain">.</span><span class="element">end_type</span><span class="plain"> == </span><span class="constant">EMPTY_RANGE_END</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">E1</span><span class="plain">.</span><span class="element">end_type</span><span class="plain"> == </span><span class="constant">EMPTY_RANGE_END</span><span class="plain">) && (</span><span class="identifier">E2</span><span class="plain">.</span><span class="element">end_type</span><span class="plain"> == </span><span class="constant">EMPTY_RANGE_END</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
@ -295,7 +288,6 @@ different version needs.) The return value is true if an actual change took
|
||||||
place, and false otherwise.
|
place, and false otherwise.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::intersect_range</span><span class="plain">(</span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R1</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R2</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">VersionNumberRanges::intersect_range</span><span class="plain">(</span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R1</span><span class="plain">, </span><span class="reserved">semver_range</span><span class="plain"> *</span><span class="identifier">R2</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lc</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::stricter</span><span class="plain">(</span><span class="identifier">R1</span><span class="plain">-></span><span class="element">lower</span><span class="plain">, </span><span class="identifier">R2</span><span class="plain">-></span><span class="element">lower</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">lc</span><span class="plain"> = </span><span class="functiontext">VersionNumberRanges::stricter</span><span class="plain">(</span><span class="identifier">R1</span><span class="plain">-></span><span class="element">lower</span><span class="plain">, </span><span class="identifier">R2</span><span class="plain">-></span><span class="element">lower</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">);</span>
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
convenient to store them directly here than to use a dictionary.
|
convenient to store them directly here than to use a dictionary.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_bibliographic_datum</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_bibliographic_datum</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">;</span>
|
||||||
|
@ -60,7 +59,6 @@ convenient to store them directly here than to use a dictionary.
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>The following check the rules:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>The following check the rules:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Bibliographic::datum_can_be_declared</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Bibliographic::datum_can_be_declared</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
||||||
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
|
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
|
||||||
|
@ -84,7 +82,6 @@ convenient to store them directly here than to use a dictionary.
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Initialising a web. </b>Each web has the following slate of data:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Initialising a web. </b>Each web has the following slate of data:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::initialise_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::initialise_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
|
||||||
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
|
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
|
||||||
|
@ -123,7 +120,6 @@ convenient to store them directly here than to use a dictionary.
|
||||||
to check that all the mandatory declarations have indeed been made:
|
to check that all the mandatory declarations have indeed been made:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::check_required_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Bibliographic::check_required_data</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
|
||||||
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
|
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain">;</span>
|
||||||
|
@ -142,7 +138,6 @@ to check that all the mandatory declarations have indeed been made:
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Reading bibliographic data. </b>Key names are case-sensitive.
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Reading bibliographic data. </b>Key names are case-sensitive.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">) {</span>
|
||||||
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
|
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
|
||||||
|
@ -179,7 +174,6 @@ to check that all the mandatory declarations have indeed been made:
|
||||||
so this routine never fails.
|
so this routine never fails.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain">) {</span>
|
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="functiontext">Bibliographic::set_datum</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">key</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">val</span><span class="plain">) {</span>
|
||||||
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
|
<span class="reserved">web_bibliographic_datum</span><span class="plain"> *</span><span class="identifier">bd</span><span class="plain"> = </span><span class="functiontext">Bibliographic::look_up_datum</span><span class="plain">(</span><span class="identifier">Wm</span><span class="plain">, </span><span class="identifier">key</span><span class="plain">);</span>
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
file exists, we look for the same thing in the current working directory.
|
file exists, we look for the same thing in the current working directory.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">-></span><span class="element">path_to_web</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"build.txt"</span><span class="plain">);</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">-></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>§2. </b>The format of such a file is very simple: up to three text fields:
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>The format of such a file is very simple: up to three text fields:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_file_data</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_file_data</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prerelease_text</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">prerelease_text</span><span class="plain">;</span>
|
||||||
|
@ -66,7 +64,6 @@ file exists, we look for the same thing in the current working directory.
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Here's how to read in a build file:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Here's how to read in a build file:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">build_file_data</span><span class="plain"> </span><span class="functiontext">BuildFiles::read</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">build_file_data</span><span class="plain"> </span><span class="functiontext">BuildFiles::read</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">;</span>
|
<span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">;</span>
|
||||||
|
@ -104,7 +101,6 @@ file exists, we look for the same thing in the current working directory.
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>And here is how to write one:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>And here is how to write one:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::write</span><span class="plain">(</span><span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::write</span><span class="plain">(</span><span class="reserved">build_file_data</span><span class="plain"> </span><span class="identifier">bfd</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">vr_stream</span><span class="plain">;</span>
|
<span class="reserved">text_stream</span><span class="plain"> </span><span class="identifier">vr_stream</span><span class="plain">;</span>
|
||||||
|
@ -128,7 +124,6 @@ file exists, we look for the same thing in the current working directory.
|
||||||
set some bibliographic data.
|
set some bibliographic data.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::set_bibliographic_data_for</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::set_bibliographic_data_for</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span>
|
||||||
|
@ -158,7 +153,6 @@ the Contents page to specify all of this.
|
||||||
guaranteed to produce a semver-legal version number.
|
guaranteed to produce a semver-legal version number.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::deduce_semver</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::deduce_semver</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">);</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">combined</span><span class="plain">);</span>
|
||||||
|
@ -194,7 +188,6 @@ guaranteed to produce a semver-legal version number.
|
||||||
number if we find that the date has changed.
|
number if we find that the date has changed.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::advance_for_web</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::advance_for_web</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">BuildFiles::build_file_for_web</span><span class="plain">(</span><span class="identifier">WS</span><span class="plain">);</span>
|
||||||
|
@ -222,7 +215,6 @@ number if we find that the date has changed.
|
||||||
rewrite <code class="display"><span class="extract">dateline</span></code> to today and return <code class="display"><span class="extract">FALSE</span></code>.
|
rewrite <code class="display"><span class="extract">dateline</span></code> to today and return <code class="display"><span class="extract">FALSE</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildFiles::dated_today</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">dateline</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">BuildFiles::dated_today</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">dateline</span><span class="plain">) {</span>
|
||||||
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">monthname</span><span class="plain">[12] = { </span><span class="string">"January"</span><span class="plain">, </span><span class="string">"February"</span><span class="plain">, </span><span class="string">"March"</span><span class="plain">, </span><span class="string">"April"</span><span class="plain">, </span><span class="string">"May"</span><span class="plain">, </span><span class="string">"June"</span><span class="plain">,</span>
|
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">monthname</span><span class="plain">[12] = { </span><span class="string">"January"</span><span class="plain">, </span><span class="string">"February"</span><span class="plain">, </span><span class="string">"March"</span><span class="plain">, </span><span class="string">"April"</span><span class="plain">, </span><span class="string">"May"</span><span class="plain">, </span><span class="string">"June"</span><span class="plain">,</span>
|
||||||
|
@ -256,7 +248,6 @@ then it rolls back around to <code class="display"><span class="extract">A</span
|
||||||
some 58 years.
|
some 58 years.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::increment</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">BuildFiles::increment</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">T</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) != </span><span class="constant">4</span><span class="plain">) </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"build code malformed: %S"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">) != </span><span class="constant">4</span><span class="plain">) </span><span class="functiontext">Errors::with_text</span><span class="plain">(</span><span class="string">"build code malformed: %S"</span><span class="plain">, </span><span class="identifier">T</span><span class="plain">);</span>
|
||||||
|
|
|
@ -62,7 +62,6 @@ means.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::new</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">m</span><span class="plain">) {</span>
|
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::new</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">at</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">m</span><span class="plain">) {</span>
|
||||||
<span class="reserved">module</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module</span><span class="plain">);</span>
|
<span class="reserved">module</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module</span><span class="plain">);</span>
|
||||||
|
@ -90,7 +89,6 @@ main web — which can be tangled, and results in an actual program —
|
||||||
internally named <code class="display"><span class="extract">"(main)"</span></code>, a name which the user will never see.
|
internally named <code class="display"><span class="extract">"(main)"</span></code>, a name which the user will never see.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::create_main_module</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::create_main_module</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebModules::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"(main)"</span><span class="plain">, </span><span class="identifier">WS</span><span class="plain">-></span><span class="element">path_to_web</span><span class="plain">, </span><span class="constant">READING_WEB_MOM</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebModules::new</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"(main)"</span><span class="plain">, </span><span class="identifier">WS</span><span class="plain">-></span><span class="element">path_to_web</span><span class="plain">, </span><span class="constant">READING_WEB_MOM</span><span class="plain">);</span>
|
||||||
|
@ -107,7 +105,6 @@ needed when constructing makefiles, since the source code in B affects the
|
||||||
program generated by A.
|
program generated by A.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebModules::dependency</span><span class="plain">(</span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebModules::dependency</span><span class="plain">(</span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">module</span><span class="plain"> *</span><span class="identifier">B</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">B</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no module"</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">A</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) || (</span><span class="identifier">B</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no module"</span><span class="plain">);</span>
|
||||||
|
@ -123,7 +120,6 @@ program generated by A.
|
||||||
(At one time there was going to be a more elaborate search hierarchy.)
|
(At one time there was going to be a more elaborate search hierarchy.)
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_search</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_search</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_search</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_search</span><span class="plain">;</span>
|
||||||
|
@ -137,7 +133,6 @@ program generated by A.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b></p>
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">module_search</span><span class="plain"> *</span><span class="functiontext">WebModules::make_search_path</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">ext_path</span><span class="plain">) {</span>
|
<span class="reserved">module_search</span><span class="plain"> *</span><span class="functiontext">WebModules::make_search_path</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">ext_path</span><span class="plain">) {</span>
|
||||||
<span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module_search</span><span class="plain">);</span>
|
<span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">module_search</span><span class="plain">);</span>
|
||||||
|
@ -154,7 +149,6 @@ program generated by A.
|
||||||
called <code class="display"><span class="extract">Blah</span></code> on disc? We try four possibilities in sequence:
|
called <code class="display"><span class="extract">Blah</span></code> on disc? We try four possibilities in sequence:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::find</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">, </span><span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
|
<span class="reserved">module</span><span class="plain"> *</span><span class="functiontext">WebModules::find</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">WS</span><span class="plain">, </span><span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">ms</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">T</span><span class="plain">);</span>
|
||||||
|
@ -202,7 +196,6 @@ and a dependency created from the web's <code class="display"><span class="extra
|
||||||
sought if it looks like a web.
|
sought if it looks like a web.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebModules::exists</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebModules::exists</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">);</span>
|
||||||
|
|
|
@ -58,7 +58,6 @@ produce the following metadata structure.
|
||||||
<p class="inwebparagraph">Each web produces a single instance of <code class="display"><span class="extract">web_md</span></code>:
|
<p class="inwebparagraph">Each web produces a single instance of <code class="display"><span class="extract">web_md</span></code>:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_web</span><span class="plain">; </span><span class="comment">relative to the current working directory</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_web</span><span class="plain">; </span><span class="comment">relative to the current working directory</span>
|
||||||
|
@ -88,7 +87,6 @@ produce the following metadata structure.
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>The <code class="display"><span class="extract">chapters_md</span></code> list in a <code class="display"><span class="extract">web_md</span></code> contains these as its entries:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>The <code class="display"><span class="extract">chapters_md</span></code> list in a <code class="display"><span class="extract">web_md</span></code> contains these as its entries:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter_md</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">chapter_md</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_range</span><span class="plain">; </span><span class="comment">e.g., <code class="display"><span class="extract">P</span></code> for Preliminaries, <code class="display"><span class="extract">7</span></code> for Chapter 7, <code class="display"><span class="extract">C</span></code> for Appendix C</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">ch_range</span><span class="plain">; </span><span class="comment">e.g., <code class="display"><span class="extract">P</span></code> for Preliminaries, <code class="display"><span class="extract">7</span></code> for Chapter 7, <code class="display"><span class="extract">C</span></code> for Appendix C</span>
|
||||||
|
@ -111,7 +109,6 @@ produce the following metadata structure.
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>And the <code class="display"><span class="extract">sections_md</span></code> list in a <code class="display"><span class="extract">chapter_md</span></code> contains these as its entries:
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b>And the <code class="display"><span class="extract">sections_md</span></code> list in a <code class="display"><span class="extract">chapter_md</span></code> contains these as its entries:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section_md</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">section_md</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sect_title</span><span class="plain">; </span><span class="comment">e.g., "Program Control"</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">sect_title</span><span class="plain">; </span><span class="comment">e.g., "Program Control"</span>
|
||||||
|
@ -138,7 +135,6 @@ in one (and thus, implicitly, a single chapter and a single section), in which
|
||||||
case a filename <code class="display"><span class="extract">alt_F</span></code> is supplied.
|
case a filename <code class="display"><span class="extract">alt_F</span></code> is supplied.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">web_md</span><span class="plain"> *</span><span class="functiontext">WebMetadata::get_without_modules</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">alt_F</span><span class="plain">) {</span>
|
<span class="reserved">web_md</span><span class="plain"> *</span><span class="functiontext">WebMetadata::get_without_modules</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">alt_F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">alt_F</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">WebMetadata::get</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">alt_F</span><span class="plain">, </span><span class="constant">V2_SYNTAX</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
|
||||||
|
@ -243,7 +239,6 @@ own right: instead, it's the top few lines of the single file. We handle that
|
||||||
by halting at the junction point.
|
by halting at the junction point.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">reader_state</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">reader_state</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">;</span>
|
||||||
|
@ -338,7 +333,6 @@ and sets out bibliographic information about the web, the sections and their
|
||||||
organisation, and so on.
|
organisation, and so on.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebMetadata::read_contents_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">WebMetadata::read_contents_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
|
||||||
<span class="reserved">reader_state</span><span class="plain"> *</span><span class="identifier">RS</span><span class="plain"> = (</span><span class="reserved">reader_state</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span>
|
<span class="reserved">reader_state</span><span class="plain"> *</span><span class="identifier">RS</span><span class="plain"> = (</span><span class="reserved">reader_state</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span>
|
||||||
|
@ -862,7 +856,6 @@ the extension needs to be <code class="display"><span class="extract">.i6t</span
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Relative pathnames or filenames. </b></p>
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Relative pathnames or filenames. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::directory_looks_like_a_web</span><span class="plain">(</span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">) {</span>
|
||||||
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="functiontext">WebMetadata::contents_filename</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
|
<span class="reserved">return</span><span class="plain"> </span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="functiontext">WebMetadata::contents_filename</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">));</span>
|
||||||
|
@ -881,7 +874,6 @@ the extension needs to be <code class="display"><span class="extract">.i6t</span
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Statistics. </b></p>
|
<p class="inwebparagraph"><a id="SP9"></a><b>§9. Statistics. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::chapter_count</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">WebMetadata::chapter_count</span><span class="plain">(</span><span class="reserved">web_md</span><span class="plain"> *</span><span class="identifier">Wm</span><span class="plain">) {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
|
|
@ -30,7 +30,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Strings. </b></p>
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. Strings. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_strings</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_strings</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Jack and Jill"</span><span class="plain">);</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain"> = </span><span class="functiontext">Str::new_from_wide_string</span><span class="plain">(</span><span class="identifier">L</span><span class="string">"Jack and Jill"</span><span class="plain">);</span>
|
||||||
|
@ -70,7 +69,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Literals. </b></p>
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. Literals. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_literals</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_literals</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"This is \"tricky"</span><span class="plain">); </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"bananas"</span><span class="plain">);</span>
|
<span class="identifier">LOG</span><span class="plain">(</span><span class="string">"This is \"tricky"</span><span class="plain">); </span><span class="identifier">LOG</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"bananas"</span><span class="plain">);</span>
|
||||||
|
@ -92,7 +90,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Dictionaries. </b></p>
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Dictionaries. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_dictionaries</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_dictionaries</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
||||||
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Dictionaries::new</span><span class="plain">(2, </span><span class="constant">TRUE</span><span class="plain">);</span>
|
<span class="reserved">dictionary</span><span class="plain"> *</span><span class="identifier">D</span><span class="plain"> = </span><span class="functiontext">Dictionaries::new</span><span class="plain">(2, </span><span class="constant">TRUE</span><span class="plain">);</span>
|
||||||
|
@ -153,7 +150,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Regexp. </b></p>
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. Regexp. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_regexp</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_regexp</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
|
||||||
|
@ -193,7 +189,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Replacements. </b></p>
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. Replacements. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_replacement</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_replacement</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
|
||||||
|
@ -227,7 +222,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Linked lists. </b></p>
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Linked lists. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_linked_lists</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_linked_lists</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">test_list</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
|
<span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">test_list</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
|
||||||
|
@ -258,7 +252,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Stacks. </b></p>
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. Stacks. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_stacks</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_stacks</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
|
||||||
<span class="constant">lifo_stack</span><span class="plain"> *</span><span class="identifier">test_stack</span><span class="plain"> = </span><span class="identifier">NEW_LIFO_STACK</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
|
<span class="constant">lifo_stack</span><span class="plain"> *</span><span class="identifier">test_stack</span><span class="plain"> = </span><span class="identifier">NEW_LIFO_STACK</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain">);</span>
|
||||||
|
@ -291,7 +284,6 @@
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Semantic versions. </b></p>
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Semantic versions. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Unit::test_range</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">) {</span>
|
||||||
<span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="functiontext">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
|
<span class="reserved">semantic_version_number</span><span class="plain"> </span><span class="identifier">V</span><span class="plain"> = </span><span class="functiontext">VersionNumbers::from_text</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
|
||||||
|
|
|
@ -81,7 +81,6 @@ makes all the necessary constructor functions for creating objects of these
|
||||||
types.
|
types.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">source_line</span><span class="plain">, </span><span class="constant">1000</span><span class="plain">)</span>
|
<span class="identifier">ALLOCATE_IN_ARRAYS</span><span class="plain">(</span><span class="reserved">source_line</span><span class="plain">, </span><span class="constant">1000</span><span class="plain">)</span>
|
||||||
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">breadcrumb_request</span><span class="plain">)</span>
|
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">breadcrumb_request</span><span class="plain">)</span>
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
command line: there will only ever be one of these.
|
command line: there will only ever be one of these.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inweb_instructions</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inweb_instructions</span><span class="plain"> {</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inweb_mode</span><span class="plain">; </span><span class="comment">our main mode of operation: one of the <code class="display"><span class="extract">*_MODE</span></code> constants</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">inweb_mode</span><span class="plain">; </span><span class="comment">our main mode of operation: one of the <code class="display"><span class="extract">*_MODE</span></code> constants</span>
|
||||||
|
@ -68,6 +67,9 @@ command line: there will only ever be one of these.
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbose_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-verbose</span></code>: print names of files read to stdout</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbose_switch</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-verbose</span></code>: print names of files read to stdout</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">targets</span><span class="plain">; </span><span class="comment">used only for parsing</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">targets</span><span class="plain">; </span><span class="comment">used only for parsing</span>
|
||||||
|
|
||||||
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">test_language_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-test-language X</span></code></span>
|
||||||
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">test_language_on_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-test-language-on X</span></code></span>
|
||||||
|
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">import_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-import X</span></code>: where to find imported webs</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">import_setting</span><span class="plain">; </span><span class="comment"><code class="display"><span class="extract">-import X</span></code>: where to find imported webs</span>
|
||||||
<span class="plain">} </span><span class="reserved">inweb_instructions</span><span class="plain">;</span>
|
<span class="plain">} </span><span class="reserved">inweb_instructions</span><span class="plain">;</span>
|
||||||
|
|
||||||
|
@ -89,7 +91,6 @@ to enumerate constants for the Inweb-specific command line switches, and
|
||||||
then declare them.
|
then declare them.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="functiontext">Configuration::read</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
|
<span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="functiontext">Configuration::read</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
|
||||||
<span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="identifier">args</span><span class="plain">;</span>
|
<span class="reserved">inweb_instructions</span><span class="plain"> </span><span class="identifier">args</span><span class="plain">;</span>
|
||||||
|
@ -149,6 +150,8 @@ then declare them.
|
||||||
<span class="identifier">args</span><span class="plain">.</span><span class="element">weave_docs</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
<span class="identifier">args</span><span class="plain">.</span><span class="element">weave_docs</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
|
||||||
<span class="identifier">args</span><span class="plain">.</span><span class="element">import_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="identifier">args</span><span class="plain">.</span><span class="element">import_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
<span class="identifier">args</span><span class="plain">.</span><span class="element">targets</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="identifier">args</span><span class="plain">.</span><span class="element">targets</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
|
<span class="identifier">args</span><span class="plain">.</span><span class="element">test_language_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
<span class="identifier">args</span><span class="plain">.</span><span class="element">test_language_on_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
@ -168,6 +171,8 @@ provides automatically.
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">LANGUAGE_CLSW</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">LANGUAGE_CLSW</span>
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">LANGUAGES_CLSW</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">LANGUAGES_CLSW</span>
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">SHOW_LANGUAGES_CLSW</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">SHOW_LANGUAGES_CLSW</span>
|
||||||
|
<span class="definitionkeyword">enum</span> <span class="constant">TEST_LANGUAGE_CLSW</span>
|
||||||
|
<span class="definitionkeyword">enum</span> <span class="constant">TEST_LANGUAGE_ON_CLSW</span>
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">ANALYSIS_CLSG</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">ANALYSIS_CLSG</span>
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">CATALOGUE_CLSW</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">CATALOGUE_CLSW</span>
|
||||||
<span class="definitionkeyword">enum</span> <span class="constant">FUNCTIONS_CLSW</span>
|
<span class="definitionkeyword">enum</span> <span class="constant">FUNCTIONS_CLSW</span>
|
||||||
|
@ -222,6 +227,10 @@ provides automatically.
|
||||||
<span class="identifier">L</span><span class="string">"read all language definitions in path X"</span><span class="plain">);</span>
|
<span class="identifier">L</span><span class="string">"read all language definitions in path X"</span><span class="plain">);</span>
|
||||||
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">SHOW_LANGUAGES_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"show-languages"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">SHOW_LANGUAGES_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"show-languages"</span><span class="plain">, </span><span class="constant">1</span><span class="plain">,</span>
|
||||||
<span class="identifier">L</span><span class="string">"list programming languages supported by Inweb"</span><span class="plain">);</span>
|
<span class="identifier">L</span><span class="string">"list programming languages supported by Inweb"</span><span class="plain">);</span>
|
||||||
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">TEST_LANGUAGE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"test-language"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
|
||||||
|
<span class="identifier">L</span><span class="string">"test language X on..."</span><span class="plain">);</span>
|
||||||
|
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">TEST_LANGUAGE_ON_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"test-language-on"</span><span class="plain">, </span><span class="constant">2</span><span class="plain">,</span>
|
||||||
|
<span class="identifier">L</span><span class="string">"...the code in the file X"</span><span class="plain">);</span>
|
||||||
<span class="functiontext">CommandLine::end_group</span><span class="plain">();</span>
|
<span class="functiontext">CommandLine::end_group</span><span class="plain">();</span>
|
||||||
|
|
||||||
<span class="functiontext">CommandLine::begin_group</span><span class="plain">(</span><span class="constant">ANALYSIS_CLSG</span><span class="plain">,</span>
|
<span class="functiontext">CommandLine::begin_group</span><span class="plain">(</span><span class="constant">ANALYSIS_CLSG</span><span class="plain">,</span>
|
||||||
|
@ -295,7 +304,6 @@ provides automatically.
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Foundation calls this on any <code class="display"><span class="extract">-switch</span></code> argument read:
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. </b>Foundation calls this on any <code class="display"><span class="extract">-switch</span></code> argument read:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::switch</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">val</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
||||||
<span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="reserved">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
|
<span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="reserved">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
|
||||||
|
@ -312,6 +320,13 @@ provides automatically.
|
||||||
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SHOW_LANGUAGES_CLSW:</span>
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SHOW_LANGUAGES_CLSW:</span>
|
||||||
<span class="identifier">args</span><span class="plain">-></span><span class="element">show_languages_switch</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="identifier">args</span><span class="plain">-></span><span class="element">show_languages_switch</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||||
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">TEST_LANGUAGE_CLSW:</span>
|
||||||
|
<span class="identifier">args</span><span class="plain">-></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">-></span><span class="element">test_language_on_setting</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
|
||||||
|
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||||
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CATALOGUE_CLSW:</span>
|
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">CATALOGUE_CLSW:</span>
|
||||||
<span class="identifier">args</span><span class="plain">-></span><span class="element">catalogue_switch</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="identifier">args</span><span class="plain">-></span><span class="element">catalogue_switch</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
<span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="identifier">args</span><span class="plain">, </span><span class="constant">ANALYSE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
|
||||||
|
@ -418,7 +433,6 @@ neither a switch (like <code class="display"><span class="extract">-weave</span>
|
||||||
the <code class="display"><span class="extract">X</span></code> in <code class="display"><span class="extract">-weave-as X</span></code>).
|
the <code class="display"><span class="extract">X</span></code> in <code class="display"><span class="extract">-weave-as X</span></code>).
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::bareword</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::bareword</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">id</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
|
||||||
<span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="reserved">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
|
<span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain"> = (</span><span class="reserved">inweb_instructions</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
|
||||||
|
@ -440,7 +454,6 @@ are converted into swarm settings instead. <code class="display"><span class="ex
|
||||||
Otherwise, a range is a chapter number/letter, or a section range.
|
Otherwise, a range is a chapter number/letter, or a section range.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::set_range</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::set_range</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">opt</span><span class="plain">) {</span>
|
||||||
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
|
||||||
|
@ -474,12 +487,11 @@ Otherwise, a range is a chapter number/letter, or a section range.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">The function Configuration::set_range is used in <a href="#SP4">§4</a>, 1/pc (<a href="1-pc.html#SP7_3_3">§7.3.3</a>).</p>
|
<p class="endnote">The function Configuration::set_range is used in <a href="#SP4">§4</a>, 1/pc (<a href="1-pc.html#SP7_4_3">§7.4.3</a>).</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>We can only be in a single mode at a time:
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. </b>We can only be in a single mode at a time:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_material</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Configuration::set_fundamental_mode</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">args</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">new_material</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">args</span><span class="plain">-></span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) && (</span><span class="identifier">args</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> != </span><span class="identifier">new_material</span><span class="plain">))</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">args</span><span class="plain">-></span><span class="identifier">inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) && (</span><span class="identifier">args</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> != </span><span class="identifier">new_material</span><span class="plain">))</span>
|
||||||
|
|
|
@ -32,7 +32,6 @@
|
||||||
versions: the second was cleaned up and simplified from the first in 2019.
|
versions: the second was cleaned up and simplified from the first in 2019.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_inweb_syntax</span><span class="plain"> = </span><span class="constant">V2_SYNTAX</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_inweb_syntax</span><span class="plain"> = </span><span class="constant">V2_SYNTAX</span><span class="plain">;</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -89,7 +88,6 @@ in the current working directory. The "materials" will then be in a further
|
||||||
subfolder called <code class="display"><span class="extract">Materials</span></code>.
|
subfolder called <code class="display"><span class="extract">Materials</span></code>.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">where we are installed</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">where we are installed</span>
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb_materials</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">the materials pathname</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to_inweb_materials</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">; </span><span class="comment">the materials pathname</span>
|
||||||
|
@ -101,7 +99,6 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
|
||||||
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>We count the errors in order to be able to exit with a suitable exit code.
|
<p class="inwebparagraph"><a id="SP5"></a><b>§5. </b>We count the errors in order to be able to exit with a suitable exit code.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_inweb_errors</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_inweb_errors</span><span class="plain"> = </span><span class="constant">0</span><span class="plain">;</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -110,7 +107,6 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Main routine. </b></p>
|
<p class="inwebparagraph"><a id="SP6"></a><b>§6. Main routine. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">main</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">argc</span><span class="plain">, </span><span class="reserved">char</span><span class="plain"> **</span><span class="identifier">argv</span><span class="plain">) {</span>
|
||||||
<<span class="cwebmacro">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>><span class="plain">;</span>
|
<<span class="cwebmacro">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>><span class="plain">;</span>
|
||||||
|
@ -129,7 +125,7 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">The function main is used in <a href="#SP7_3_2">§7.3.2</a>, 8/wm (<a href="8-wm.html#SP3">§3</a>), 1/cnf (<a href="1-cnf.html#SP1">§1</a>), 4/cl (<a href="4-cl.html#SP2_4_2_5">§2.4.2.5</a>).</p>
|
<p class="endnote">The function main is used in <a href="#SP7_4_2">§7.4.2</a>, 8/wm (<a href="8-wm.html#SP3">§3</a>), 1/cnf (<a href="1-cnf.html#SP1">§1</a>), 4/cl (<a href="4-cl.html#SP2_4_2_5">§2.4.2.5</a>).</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP6_1"></a><b>§6.1. </b><code class="display">
|
<p class="inwebparagraph"><a id="SP6_1"></a><b>§6.1. </b><code class="display">
|
||||||
<<span class="cwebmacrodefn">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>> =
|
<<span class="cwebmacrodefn">Initialise inweb</span> <span class="cwebmacronumber">6.1</span>> =
|
||||||
|
@ -163,7 +159,6 @@ subfolder called <code class="display"><span class="extract">Materials</span></c
|
||||||
program: some input, some thinking, a choice of three forms of output.
|
program: some input, some thinking, a choice of three forms of output.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::follow_instructions</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">ins</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::follow_instructions</span><span class="plain">(</span><span class="reserved">inweb_instructions</span><span class="plain"> *</span><span class="identifier">ins</span><span class="plain">) {</span>
|
||||||
<span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -178,7 +173,8 @@ program: some input, some thinking, a choice of three forms of output.
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_inweb_errors</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">no_inweb_errors</span><span class="plain"> == </span><span class="constant">0</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">TRANSLATE_MODE</span><span class="plain">) </span><<span class="cwebmacro">Translate a makefile</span> <span class="cwebmacronumber">7.1</span>>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">TRANSLATE_MODE</span><span class="plain">) </span><<span class="cwebmacro">Translate a makefile</span> <span class="cwebmacronumber">7.1</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">-></span><span class="element">show_languages_switch</span><span class="plain">) </span><<span class="cwebmacro">List available programming languages</span> <span class="cwebmacronumber">7.2</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">-></span><span class="element">show_languages_switch</span><span class="plain">) </span><<span class="cwebmacro">List available programming languages</span> <span class="cwebmacronumber">7.2</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">-></span><span class="element">inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) </span><<span class="cwebmacro">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.3</span>><span class="plain">;</span>
|
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">test_language_setting</span><span class="plain">) || (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">test_language_on_setting</span><span class="plain">)) </span><<span class="cwebmacro">Test a language</span> <span class="cwebmacronumber">7.3</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">-></span><span class="element">inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) </span><<span class="cwebmacro">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.4</span>><span class="plain">;</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
@ -236,32 +232,60 @@ program: some input, some thinking, a choice of three forms of output.
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7">§7</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7">§7</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7_3"></a><b>§7.3. </b>But otherwise we do something with the given web:
|
<p class="inwebparagraph"><a id="SP7_3"></a><b>§7.3. </b>And this:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<p class="macrodefinition"><code class="display">
|
<p class="macrodefinition"><code class="display">
|
||||||
<<span class="cwebmacrodefn">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.3</span>> =
|
<<span class="cwebmacrodefn">Test a language</span> <span class="cwebmacronumber">7.3</span>> =
|
||||||
</code></p>
|
</code></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="displaydefn">
|
<pre class="displaydefn">
|
||||||
<span class="functiontext">Reader::print_web_statistics</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-></span><span class="identifier">test_language_setting</span><span class="plain">) && (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">test_language_on_setting</span><span class="plain">)) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">ANALYSE_MODE</span><span class="plain">) </span><<span class="cwebmacro">Analyse the web</span> <span class="cwebmacronumber">7.3.1</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="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">TANGLE_MODE</span><span class="plain">) </span><<span class="cwebmacro">Tangle the web</span> <span class="cwebmacronumber">7.3.2</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="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">WEAVE_MODE</span><span class="plain">) </span><<span class="cwebmacro">Weave the web</span> <span class="cwebmacronumber">7.3.3</span>><span class="plain">;</span>
|
<span class="functiontext">Painter::colour_file</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">test_language_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-></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">-></span><span class="element">test_language_setting</span><span class="plain">-></span><span class="element">language_name</span><span class="plain">, </span><span class="identifier">matter</span><span class="plain">, </span><span class="identifier">coloured</span><span class="plain">);</span>
|
||||||
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">matter</span><span class="plain">);</span>
|
||||||
|
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">coloured</span><span class="plain">);</span>
|
||||||
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
|
||||||
|
<span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"-test-language and -test-language-on must both be given"</span><span class="plain">);</span>
|
||||||
|
<span class="plain">}</span>
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7">§7</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7">§7</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7_3_1"></a><b>§7.3.1. </b>"Analysis" invokes any combination of the following diagnostic tools:
|
<p class="inwebparagraph"><a id="SP7_4"></a><b>§7.4. </b>But otherwise we do something with the given web:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<p class="macrodefinition"><code class="display">
|
<p class="macrodefinition"><code class="display">
|
||||||
<<span class="cwebmacrodefn">Analyse the web</span> <span class="cwebmacronumber">7.3.1</span>> =
|
<<span class="cwebmacrodefn">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.4</span>> =
|
||||||
|
</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">-></span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">ANALYSE_MODE</span><span class="plain">) </span><<span class="cwebmacro">Analyse the web</span> <span class="cwebmacronumber">7.4.1</span>><span class="plain">;</span>
|
||||||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">TANGLE_MODE</span><span class="plain">) </span><<span class="cwebmacro">Tangle the web</span> <span class="cwebmacronumber">7.4.2</span>><span class="plain">;</span>
|
||||||
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">inweb_mode</span><span class="plain"> == </span><span class="constant">WEAVE_MODE</span><span class="plain">) </span><<span class="cwebmacro">Weave the web</span> <span class="cwebmacronumber">7.4.3</span>><span class="plain">;</span>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
|
<p class="endnote">This code is used in <a href="#SP7">§7</a>.</p>
|
||||||
|
|
||||||
|
<p class="inwebparagraph"><a id="SP7_4_1"></a><b>§7.4.1. </b>"Analysis" invokes any combination of the following diagnostic tools:
|
||||||
|
</p>
|
||||||
|
|
||||||
|
|
||||||
|
<p class="macrodefinition"><code class="display">
|
||||||
|
<<span class="cwebmacrodefn">Analyse the web</span> <span class="cwebmacronumber">7.4.1</span>> =
|
||||||
</code></p>
|
</code></p>
|
||||||
|
|
||||||
|
|
||||||
|
@ -287,9 +311,9 @@ program: some input, some thinking, a choice of three forms of output.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7_3">§7.3</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7_4">§7.4</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7_3_2"></a><b>§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>§7.4.2. </b>We can tangle to any one of what might be several targets, numbered upwards
|
||||||
from 0. Target 0 always exists, and is the main program forming the web. For
|
from 0. Target 0 always exists, and is the main program forming the web. For
|
||||||
many webs, this will in fact be the only target, but Inweb also allows
|
many webs, this will in fact be the only target, but Inweb also allows
|
||||||
marked sections of a web to be independent targets — the idea here is to
|
marked sections of a web to be independent targets — the idea here is to
|
||||||
|
@ -307,7 +331,7 @@ line , but otherwise we impose a sensible choice based on the target.
|
||||||
|
|
||||||
|
|
||||||
<p class="macrodefinition"><code class="display">
|
<p class="macrodefinition"><code class="display">
|
||||||
<<span class="cwebmacrodefn">Tangle the web</span> <span class="cwebmacronumber">7.3.2</span>> =
|
<<span class="cwebmacrodefn">Tangle the web</span> <span class="cwebmacronumber">7.4.2</span>> =
|
||||||
</code></p>
|
</code></p>
|
||||||
|
|
||||||
|
|
||||||
|
@ -315,9 +339,9 @@ line , but otherwise we impose a sensible choice based on the target.
|
||||||
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">);</span>
|
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">);</span>
|
||||||
<span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">tn</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">tn</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">chosen_range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"0"</span><span class="plain">)) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">chosen_range</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"0"</span><span class="plain">)) {</span>
|
||||||
<<span class="cwebmacro">Work out main tangle destination</span> <span class="cwebmacronumber">7.3.2.1</span>><span class="plain">;</span>
|
<<span class="cwebmacro">Work out main tangle destination</span> <span class="cwebmacronumber">7.4.2.1</span>><span class="plain">;</span>
|
||||||
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">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">-></span><span class="element">chosen_range</span><span class="plain">)) {</span>
|
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Reader::get_section_for_range</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-></span><span class="element">chosen_range</span><span class="plain">)) {</span>
|
||||||
<<span class="cwebmacro">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.3.2.2</span>><span class="plain">;</span>
|
<<span class="cwebmacro">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.4.2.2</span>><span class="plain">;</span>
|
||||||
<span class="plain">}</span>
|
<span class="plain">}</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) { </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"no tangle destination known"</span><span class="plain">); }</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">tangle_leaf</span><span class="plain">) == </span><span class="constant">0</span><span class="plain">) { </span><span class="functiontext">Errors::fatal</span><span class="plain">(</span><span class="string">"no tangle destination known"</span><span class="plain">); }</span>
|
||||||
|
|
||||||
|
@ -334,15 +358,15 @@ line , but otherwise we impose a sensible choice based on the target.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7_3">§7.3</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7_4">§7.4</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7_3_2_1"></a><b>§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>§7.4.2.1. </b>Here the target number is 0, and the tangle is of the main part of the web,
|
||||||
which for many small webs will be the entire thing.
|
which for many small webs will be the entire thing.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<p class="macrodefinition"><code class="display">
|
<p class="macrodefinition"><code class="display">
|
||||||
<<span class="cwebmacrodefn">Work out main tangle destination</span> <span class="cwebmacronumber">7.3.2.1</span>> =
|
<<span class="cwebmacrodefn">Work out main tangle destination</span> <span class="cwebmacronumber">7.4.2.1</span>> =
|
||||||
</code></p>
|
</code></p>
|
||||||
|
|
||||||
|
|
||||||
|
@ -357,14 +381,14 @@ which for many small webs will be the entire thing.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7_3_2">§7.3.2</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7_4_2">§7.4.2</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7_3_2_2"></a><b>§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>§7.4.2.2. </b>If someone tangles, say, <code class="display"><span class="extract">2/eg</span></code> then the default filename is "Example Section".
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<p class="macrodefinition"><code class="display">
|
<p class="macrodefinition"><code class="display">
|
||||||
<<span class="cwebmacrodefn">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.3.2.2</span>> =
|
<<span class="cwebmacrodefn">Work out an independent tangle destination, from one section of the web</span> <span class="cwebmacronumber">7.4.2.2</span>> =
|
||||||
</code></p>
|
</code></p>
|
||||||
|
|
||||||
|
|
||||||
|
@ -377,20 +401,20 @@ which for many small webs will be the entire thing.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7_3_2">§7.3.2</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7_4_2">§7.4.2</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7_3_3"></a><b>§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>§7.4.3. </b>Weaving is not actually easier, it's just more thoroughly delegated:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<p class="macrodefinition"><code class="display">
|
<p class="macrodefinition"><code class="display">
|
||||||
<<span class="cwebmacrodefn">Weave the web</span> <span class="cwebmacronumber">7.3.3</span>> =
|
<<span class="cwebmacrodefn">Weave the web</span> <span class="cwebmacronumber">7.4.3</span>> =
|
||||||
</code></p>
|
</code></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="displaydefn">
|
<pre class="displaydefn">
|
||||||
<span class="functiontext">Numbering::number_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
<span class="functiontext">Numbering::number_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">weave_docs</span><span class="plain">) </span><<span class="cwebmacro">Prepare a docs weave</span> <span class="cwebmacronumber">7.3.3.1</span>><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">weave_docs</span><span class="plain">) </span><<span class="cwebmacro">Prepare a docs weave</span> <span class="cwebmacronumber">7.4.3.1</span>><span class="plain">;</span>
|
||||||
|
|
||||||
<span class="reserved">theme_tag</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain"> = </span><span class="functiontext">Tags::find_by_name</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">tag_setting</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
|
<span class="reserved">theme_tag</span><span class="plain"> *</span><span class="identifier">tag</span><span class="plain"> = </span><span class="functiontext">Tags::find_by_name</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-></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">-></span><span class="element">tag_setting</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">tag</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
|
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">tag_setting</span><span class="plain">) > </span><span class="constant">0</span><span class="plain">) && (</span><span class="identifier">tag</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
|
||||||
|
@ -402,7 +426,7 @@ which for many small webs will be the entire thing.
|
||||||
|
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain"> = </span><span class="functiontext">Formats::begin_weaving</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">r</span><span class="plain"> = </span><span class="functiontext">Formats::begin_weaving</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">pattern</span><span class="plain">);</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">r</span><span class="plain"> != </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) </span><span class="identifier">ins</span><span class="plain">-></span><span class="element">swarm_mode</span><span class="plain"> = </span><span class="identifier">r</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">r</span><span class="plain"> != </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) </span><span class="identifier">ins</span><span class="plain">-></span><span class="element">swarm_mode</span><span class="plain"> = </span><span class="identifier">r</span><span class="plain">;</span>
|
||||||
<<span class="cwebmacro">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.3.3.2</span>><span class="plain">;</span>
|
<<span class="cwebmacro">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.4.3.2</span>><span class="plain">;</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></span><span class="element">swarm_mode</span><span class="plain"> == </span><span class="constant">SWARM_OFF_SWM</span><span class="plain">) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-></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">-></span><span class="element">open_pdf_switch</span><span class="plain">;</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">shall_we_open</span><span class="plain"> = </span><span class="identifier">ins</span><span class="plain">-></span><span class="element">open_pdf_switch</span><span class="plain">;</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shall_we_open</span><span class="plain"> == </span><span class="constant">NOT_APPLICABLE</span><span class="plain">) { </span><span class="comment">i.e., if it wasn't set at the command line</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">shall_we_open</span><span class="plain"> == </span><span class="constant">NOT_APPLICABLE</span><span class="plain">) { </span><span class="comment">i.e., if it wasn't set at the command line</span>
|
||||||
|
@ -422,15 +446,15 @@ which for many small webs will be the entire thing.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7_3">§7.3</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7_4">§7.4</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7_3_3_1"></a><b>§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>§7.4.3.1. </b>If the <code class="display"><span class="extract">-weave-docs</span></code> option was used, we have to weave into a subfolder of
|
||||||
<code class="display"><span class="extract">docs</span></code>, and we'll create it if it doesn't already exist.
|
<code class="display"><span class="extract">docs</span></code>, and we'll create it if it doesn't already exist.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<p class="macrodefinition"><code class="display">
|
<p class="macrodefinition"><code class="display">
|
||||||
<<span class="cwebmacrodefn">Prepare a docs weave</span> <span class="cwebmacronumber">7.3.3.1</span>> =
|
<<span class="cwebmacrodefn">Prepare a docs weave</span> <span class="cwebmacronumber">7.4.3.1</span>> =
|
||||||
</code></p>
|
</code></p>
|
||||||
|
|
||||||
|
|
||||||
|
@ -456,10 +480,10 @@ which for many small webs will be the entire thing.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7_3_3">§7.3.3</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7_4_3">§7.4.3</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7_3_3_2"></a><b>§7.3.3.2. </b><code class="display">
|
<p class="inwebparagraph"><a id="SP7_4_3_2"></a><b>§7.4.3.2. </b><code class="display">
|
||||||
<<span class="cwebmacrodefn">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.3.3.2</span>> =
|
<<span class="cwebmacrodefn">Assign section numbers for printing purposes</span> <span class="cwebmacronumber">7.4.3.2</span>> =
|
||||||
</code></p>
|
</code></p>
|
||||||
|
|
||||||
|
|
||||||
|
@ -472,14 +496,13 @@ which for many small webs will be the entire thing.
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">This code is used in <a href="#SP7_3_3">§7.3.3</a>.</p>
|
<p class="endnote">This code is used in <a href="#SP7_4_3">§7.4.3</a>.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Error messages. </b>The Foundation module provides convenient functions to issue error messages,
|
<p class="inwebparagraph"><a id="SP8"></a><b>§8. Error messages. </b>The Foundation module provides convenient functions to issue error messages,
|
||||||
but we'll use the following wrapper when issuing an error at a line of web
|
but we'll use the following wrapper when issuing an error at a line of web
|
||||||
source:
|
source:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Main::error_in_web</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">message</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sl</span><span class="plain">) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sl</span><span class="plain">) {</span>
|
||||||
|
|
|
@ -33,7 +33,6 @@ names such as <code class="display"><span class="extract">HTML</span></code>. On
|
||||||
to such a name, and to read it in. This structure holds the result:
|
to such a name, and to read it in. This structure holds the result:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weave_pattern</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">weave_pattern</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">pattern_name</span><span class="plain">; </span><span class="comment">such as <code class="display"><span class="extract">HTML</span></code></span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">pattern_name</span><span class="plain">; </span><span class="comment">such as <code class="display"><span class="extract">HTML</span></code></span>
|
||||||
|
@ -66,7 +65,6 @@ to such a name, and to read it in. This structure holds the result:
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>When a given web needs a pattern with a given name, this is where it comes.
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>When a given web needs a pattern with a given name, this is where it comes.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="functiontext">Patterns::find</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
|
<span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="functiontext">Patterns::find</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">pattern_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">pattern_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -80,7 +78,7 @@ to such a name, and to read it in. This structure holds the result:
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">The function Patterns::find is used in <a href="#SP3_1">§3.1</a>, 1/pc (<a href="1-pc.html#SP7_3_3">§7.3.3</a>).</p>
|
<p class="endnote">The function Patterns::find is used in <a href="#SP3_1">§3.1</a>, 1/pc (<a href="1-pc.html#SP7_4_3">§7.4.3</a>).</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
<p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b><code class="display">
|
||||||
<<span class="cwebmacrodefn">Initialise the pattern structure</span> <span class="cwebmacronumber">2.1</span>> =
|
<<span class="cwebmacrodefn">Initialise the pattern structure</span> <span class="cwebmacronumber">2.1</span>> =
|
||||||
|
@ -153,7 +151,6 @@ line, and this is used to send each line in the <code class="display"><span clas
|
||||||
following routine:
|
following routine:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::scan_pattern_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::scan_pattern_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">X</span><span class="plain">) {</span>
|
||||||
<span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">wp</span><span class="plain"> = (</span><span class="reserved">weave_pattern</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span>
|
<span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">wp</span><span class="plain"> = (</span><span class="reserved">weave_pattern</span><span class="plain"> *) </span><span class="identifier">X</span><span class="plain">;</span>
|
||||||
|
@ -294,7 +291,6 @@ actual location will depend on where the pattern directory is.
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b></p>
|
<p class="inwebparagraph"><a id="SP4"></a><b>§4. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Patterns::yes_or_no</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Patterns::yes_or_no</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"yes"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"yes"</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="constant">TRUE</span><span class="plain">;</span>
|
||||||
|
@ -319,7 +315,6 @@ inherited from.
|
||||||
from each other then this routine will lock up into an infinite loop.
|
from each other then this routine will lock up into an infinite loop.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Patterns::obtain_filename</span><span class="plain">(</span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">) {</span>
|
<span class="reserved">filename</span><span class="plain"> *</span><span class="functiontext">Patterns::obtain_filename</span><span class="plain">(</span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">) {</span>
|
||||||
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::prefix_eq</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"../"</span><span class="plain">, </span><span class="constant">3</span><span class="plain">)) {</span>
|
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::prefix_eq</span><span class="plain">(</span><span class="identifier">leafname</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"../"</span><span class="plain">, </span><span class="constant">3</span><span class="plain">)) {</span>
|
||||||
|
@ -342,7 +337,6 @@ from each other then this routine will lock up into an infinite loop.
|
||||||
for payloads to be copied into weave, we make good use of the above:
|
for payloads to be copied into weave, we make good use of the above:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::copy_payloads_into_weave</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::copy_payloads_into_weave</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">weave_pattern</span><span class="plain"> *</span><span class="identifier">pattern</span><span class="plain">) {</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">;</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">leafname</span><span class="plain">;</span>
|
||||||
|
@ -371,7 +365,6 @@ for payloads to be copied into weave, we make good use of the above:
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b></p>
|
<p class="inwebparagraph"><a id="SP7"></a><b>§7. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::copy_file_into_weave</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Patterns::copy_file_into_weave</span><span class="plain">(</span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">W</span><span class="plain">, </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
|
||||||
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">H</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">-></span><span class="element">redirect_weaves_to</span><span class="plain">;</span>
|
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">H</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">-></span><span class="element">redirect_weaves_to</span><span class="plain">;</span>
|
||||||
|
|
|
@ -36,7 +36,6 @@ name following the final underscore, so in this case <code class="display"><span
|
||||||
increments sequentially in definition order.
|
increments sequentially in definition order.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">enumeration_set</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">enumeration_set</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">postfix</span><span class="plain">;</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">postfix</span><span class="plain">;</span>
|
||||||
|
@ -56,7 +55,6 @@ increments sequentially in definition order.
|
||||||
compare all against all:
|
compare all against all:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="functiontext">Enumerations::find</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">post</span><span class="plain">) {</span>
|
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="functiontext">Enumerations::find</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">post</span><span class="plain">) {</span>
|
||||||
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -76,7 +74,6 @@ sensible value, this is the start of a new enumeration set; otherwise it's
|
||||||
a further constant in what ought to be an existing set.
|
a further constant in what ought to be an existing set.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Enumerations::define</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain">,</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Enumerations::define</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">symbol</span><span class="plain">,</span>
|
||||||
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">from</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">) {</span>
|
||||||
|
@ -170,7 +167,6 @@ we would have <code class="display"><span class="extract">NO_DEFINED_ST_VALUES</
|
||||||
the code at the last line on which an <code class="display"><span class="extract">*_ST</span></code> value was defined.
|
the code at the last line on which an <code class="display"><span class="extract">*_ST</span></code> value was defined.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Enumerations::define_extents</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">target</span><span class="plain">, </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">lang</span><span class="plain">) {</span>
|
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Enumerations::define_extents</span><span class="plain">(</span><span class="constant">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">tangle_target</span><span class="plain"> *</span><span class="identifier">target</span><span class="plain">, </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">lang</span><span class="plain">) {</span>
|
||||||
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain">;</span>
|
<span class="reserved">enumeration_set</span><span class="plain"> *</span><span class="identifier">es</span><span class="plain">;</span>
|
||||||
|
|
|
@ -42,7 +42,6 @@ is so tidily divisible into lines, we can usefully make each source line
|
||||||
correspond to one of these:
|
correspond to one of these:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">source_line</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">; </span><span class="comment">the text as read in</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</span><span class="plain">; </span><span class="comment">the text as read in</span>
|
||||||
|
@ -52,6 +51,7 @@ correspond to one of these:
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">category</span><span class="plain">; </span><span class="comment">what sort of line this is: an <code class="display"><span class="extract">*_LCAT</span></code> value</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">category</span><span class="plain">; </span><span class="comment">what sort of line this is: an <code class="display"><span class="extract">*_LCAT</span></code> value</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">command_code</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">COMMAND_LCAT</span></code> lines: a <code class="display"><span class="extract">*_CMD</span></code> value</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">command_code</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">COMMAND_LCAT</span></code> lines: a <code class="display"><span class="extract">*_CMD</span></code> value</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_defn</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">BEGIN_DEFINITION_LCAT</span></code> lines</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">default_defn</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">BEGIN_DEFINITION_LCAT</span></code> lines</span>
|
||||||
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">plainer</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">BEGIN_CODE_LCAT</span></code> lines: suppresses box</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">colour_as</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">TEXT_EXTRACT_LCAT</span></code> lines</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">programming_language</span><span class="plain"> *</span><span class="identifier">colour_as</span><span class="plain">; </span><span class="comment">used only for <code class="display"><span class="extract">TEXT_EXTRACT_LCAT</span></code> lines</span>
|
||||||
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_commentary</span><span class="plain">; </span><span class="comment">flag</span>
|
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">is_commentary</span><span class="plain">; </span><span class="comment">flag</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">function</span><span class="plain"> *</span><span class="identifier">function_defined</span><span class="plain">; </span><span class="comment">if any C-like function is defined on this line</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">function</span><span class="plain"> *</span><span class="identifier">function_defined</span><span class="plain">; </span><span class="comment">if any C-like function is defined on this line</span>
|
||||||
|
@ -69,11 +69,10 @@ correspond to one of these:
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">The structure source_line is accessed in 1/pc, 2/tr, 2/tp, 2/pm, 2/ec, 2/pn, 3/ta, 3/tw, 3/tt, 4/lm, 4/as, 4/cl, 4/is, 5/tf, 5/hf and here.</p>
|
<p class="endnote">The structure source_line is accessed in 1/pc, 2/tr, 2/tp, 2/pm, 2/ec, 2/pn, 3/ta, 3/tw, 3/tt, 4/lm, 4/as, 4/cl, 4/is, 5/tf and here.</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
<p class="inwebparagraph"><a id="SP2"></a><b>§2. </b></p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">source_line</span><span class="plain"> *</span><span class="functiontext">Lines::new_source_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
<span class="reserved">source_line</span><span class="plain"> *</span><span class="functiontext">Lines::new_source_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">line</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tfp</span><span class="plain">) {</span>
|
||||||
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">source_line</span><span class="plain">);</span>
|
<span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">sl</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">source_line</span><span class="plain">);</span>
|
||||||
|
@ -84,6 +83,7 @@ correspond to one of these:
|
||||||
<span class="identifier">sl</span><span class="plain">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></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">-></span><span class="element">function_defined</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
<span class="identifier">sl</span><span class="plain">-></span><span class="element">function_defined</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
|
||||||
|
@ -102,7 +102,7 @@ correspond to one of these:
|
||||||
|
|
||||||
<p class="inwebparagraph"></p>
|
<p class="inwebparagraph"></p>
|
||||||
|
|
||||||
<p class="endnote">The function Lines::new_source_line is used in 2/tr (<a href="2-tr.html#SP6_1_2">§6.1.2</a>), 2/tp (<a href="2-tp.html#SP1_1_5_1">§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">§6.1.2</a>), 2/tp (<a href="2-tp.html#SP1_1_5_1">§1.1.5.1</a>, <a href="2-tp.html#SP1_1_6_7_1">§1.1.6.7.1</a>).</p>
|
||||||
|
|
||||||
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Categories. </b>The line categories are enumerated as follows. We briefly note what the text
|
<p class="inwebparagraph"><a id="SP3"></a><b>§3. Categories. </b>The line categories are enumerated as follows. We briefly note what the text
|
||||||
operands (TO and TO2) are set to, if anything: most of the time they're blank.
|
operands (TO and TO2) are set to, if anything: most of the time they're blank.
|
||||||
|
@ -143,7 +143,6 @@ version 1 syntax; version 2 removed the need for <code class="display"><span cla
|
||||||
of Inweb:
|
of Inweb:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Lines::category_name</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">) {</span>
|
<span class="reserved">char</span><span class="plain"> *</span><span class="functiontext">Lines::category_name</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">) {</span>
|
||||||
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">cat</span><span class="plain">) {</span>
|
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">cat</span><span class="plain">) {</span>
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
<p class="inwebparagraph"><a id="SP1"></a><b>§1. </b>We store these like so:
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. </b>We store these like so:
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">para_macro</span><span class="plain"> {</span>
|
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">para_macro</span><span class="plain"> {</span>
|
||||||
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">macro_name</span><span class="plain">; </span><span class="comment">usually long, like "Create a paragraph macro here"</span>
|
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">macro_name</span><span class="plain">; </span><span class="comment">usually long, like "Create a paragraph macro here"</span>
|
||||||
|
@ -50,7 +49,6 @@
|
||||||
the usage of these is always a single section.
|
the usage of these is always a single section.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="functiontext">Macros::create</span><span class="plain">(</span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
|
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="functiontext">Macros::create</span><span class="plain">(</span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">S</span><span class="plain">, </span><span class="reserved">paragraph</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">source_line</span><span class="plain"> *</span><span class="identifier">L</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">) {</span>
|
||||||
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">para_macro</span><span class="plain">);</span>
|
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">para_macro</span><span class="plain">);</span>
|
||||||
|
@ -74,7 +72,6 @@ you can use the same macro name twice in different sections; and lookup is
|
||||||
much faster.
|
much faster.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
|
||||||
<pre class="display">
|
<pre class="display">
|
||||||
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="functiontext">Macros::find_by_name</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">) {</span>
|
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="functiontext">Macros::find_by_name</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">name</span><span class="plain">, </span><span class="reserved">section</span><span class="plain"> *</span><span class="identifier">scope</span><span class="plain">) {</span>
|
||||||
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">;</span>
|
<span class="reserved">para_macro</span><span class="plain"> *</span><span class="identifier">pmac</span><span class="plain">;</span>
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue