Conform to new README system

This commit is contained in:
Graham Nelson 2020-03-23 21:39:27 +00:00
parent c49d4c688b
commit 3af0f2eeb0
20 changed files with 2631 additions and 1106 deletions

View file

@ -19,15 +19,17 @@ case, |_array_MT| appended. MT stands for "memory type".
@e breadcrumb_request_MT
@e c_structure_MT
@e chapter_MT
@e para_macro_MT
@e enumeration_set_MT
@e function_MT
@e hash_table_entry_MT
@e hash_table_entry_usage_MT
@e macro_MT
@e macro_tokens_MT
@e macro_usage_MT
@e module_MT
@e module_search_MT
@e nonterminal_variable_MT
@e para_macro_MT
@e paragraph_MT
@e paragraph_tagging_MT
@e preform_nonterminal_MT
@ -43,6 +45,7 @@ case, |_array_MT| appended. MT stands for "memory type".
@e weave_pattern_MT
@e weave_target_MT
@e web_MT
@e writeme_asset_MT
@ And then expand the following macros, all defined in Foundation. This
makes all the necessary constructor functions for creating objects of these
@ -54,26 +57,29 @@ ALLOCATE_INDIVIDUALLY(bibliographic_datum)
ALLOCATE_INDIVIDUALLY(breadcrumb_request)
ALLOCATE_INDIVIDUALLY(c_structure)
ALLOCATE_INDIVIDUALLY(chapter)
ALLOCATE_INDIVIDUALLY(para_macro)
ALLOCATE_INDIVIDUALLY(enumeration_set)
ALLOCATE_INDIVIDUALLY(function)
ALLOCATE_INDIVIDUALLY(hash_table_entry_usage)
ALLOCATE_INDIVIDUALLY(hash_table_entry)
ALLOCATE_INDIVIDUALLY(macro_tokens)
ALLOCATE_INDIVIDUALLY(macro_usage)
ALLOCATE_INDIVIDUALLY(module)
ALLOCATE_INDIVIDUALLY(macro)
ALLOCATE_INDIVIDUALLY(module_search)
ALLOCATE_INDIVIDUALLY(module)
ALLOCATE_INDIVIDUALLY(nonterminal_variable)
ALLOCATE_INDIVIDUALLY(para_macro)
ALLOCATE_INDIVIDUALLY(paragraph_tagging)
ALLOCATE_INDIVIDUALLY(paragraph)
ALLOCATE_INDIVIDUALLY(preform_nonterminal)
ALLOCATE_INDIVIDUALLY(programming_language)
ALLOCATE_INDIVIDUALLY(tex_results)
ALLOCATE_INDIVIDUALLY(section)
ALLOCATE_INDIVIDUALLY(structure_element)
ALLOCATE_INDIVIDUALLY(tangle_target)
ALLOCATE_INDIVIDUALLY(tex_results)
ALLOCATE_INDIVIDUALLY(text_literal)
ALLOCATE_INDIVIDUALLY(theme_tag)
ALLOCATE_INDIVIDUALLY(weave_format)
ALLOCATE_INDIVIDUALLY(weave_pattern)
ALLOCATE_INDIVIDUALLY(weave_target)
ALLOCATE_INDIVIDUALLY(web)
ALLOCATE_INDIVIDUALLY(writeme_asset)

View file

@ -33,6 +33,7 @@ typedef struct inweb_instructions {
struct filename *makefile_setting; /* |-makefile X|: the filename X, if supplied */
struct filename *gitignore_setting; /* |-gitignore X|: the filename X, if supplied */
struct filename *advance_setting; /* |-advance-build-file X|: advance build file X */
struct filename *writeme_setting; /* |-write-me X|: advance build file X */
struct filename *prototype_setting; /* |-prototype X|: the pathname X, if supplied */
struct filename *navigation_setting; /* |-navigation X|: the filename X, if supplied */
struct linked_list *breadcrumb_setting; /* of |breadcrumb_request| */
@ -91,6 +92,7 @@ inweb_instructions Configuration::read(int argc, char **argv) {
args.makefile_setting = NULL;
args.gitignore_setting = NULL;
args.advance_setting = NULL;
args.writeme_setting = NULL;
args.prototype_setting = NULL;
args.navigation_setting = NULL;
args.breadcrumb_setting = NEW_LINKED_LIST(breadcrumb_request);
@ -113,6 +115,7 @@ provides automatically.
@e ADVANCE_CLSW
@e GITIGNORE_CLSW
@e MAKEFILE_CLSW
@e WRITEME_CLSW
@e ADVANCE_FILE_CLSW
@e PROTOTYPE_CLSW
@e SCAN_CLSW
@ -159,6 +162,8 @@ provides automatically.
L"write a .gitignore file for this web and store it in X");
CommandLine::declare_switch(ADVANCE_FILE_CLSW, L"advance-build-file", 2,
L"increment daily build code in file X");
CommandLine::declare_switch(WRITEME_CLSW, L"write-me", 2,
L"write a read-me file following instructions in file X");
CommandLine::declare_switch(PROTOTYPE_CLSW, L"prototype", 2,
L"translate makefile from prototype X");
CommandLine::declare_switch(FUNCTIONS_CLSW, L"functions", 1,
@ -230,6 +235,10 @@ void Configuration::switch(int id, int val, text_stream *arg, void *state) {
args->advance_setting = Filenames::from_text(arg);
Configuration::set_fundamental_mode(args, TRANSLATE_MODE);
break;
case WRITEME_CLSW:
args->writeme_setting = Filenames::from_text(arg);
Configuration::set_fundamental_mode(args, TRANSLATE_MODE);
break;
case PROTOTYPE_CLSW:
args->prototype_setting = Filenames::from_text(arg);
Configuration::set_fundamental_mode(args, TRANSLATE_MODE); break;

View file

@ -96,7 +96,7 @@ void Main::follow_instructions(inweb_instructions *ins) {
if ((ins->chosen_web) || (ins->chosen_file))
W = Reader::load_web(ins->chosen_web, ins->chosen_file,
Modules::make_search_path(ins->import_setting), ins->verbose_switch,
ins->inweb_mode, ins->weave_into_setting);
ins->inweb_mode, ins->weave_into_setting, TRUE);
if (no_inweb_errors == 0) {
if (ins->inweb_mode == TRANSLATE_MODE) @<Translate a makefile@>
else if (ins->inweb_mode != NO_MODE) @<Analyse, tangle or weave an existing web@>;
@ -110,12 +110,16 @@ void Main::follow_instructions(inweb_instructions *ins) {
ins->prototype_setting = Filenames::from_text(I"makescript.txt");
if ((ins->gitignore_setting) && (ins->prototype_setting == NULL))
ins->prototype_setting = Filenames::from_text(I"gitignorescript.txt");
if ((ins->writeme_setting) && (ins->prototype_setting == NULL))
ins->prototype_setting = Filenames::from_text(I"READMEscript.txt");
if (ins->makefile_setting)
Makefiles::write(W, ins->prototype_setting, ins->makefile_setting);
else if (ins->gitignore_setting)
Git::write_gitignore(W, ins->prototype_setting, ins->gitignore_setting);
else if (ins->advance_setting)
BuildFiles::advance(ins->advance_setting);
else if (ins->writeme_setting)
Readme::write(ins->prototype_setting, ins->writeme_setting);
@ But otherwise we do something with the given web:

View file

@ -50,7 +50,7 @@ typedef struct web {
@ =
web *Reader::load_web(pathname *P, filename *alt_F, module_search *I, int verbosely,
int inweb_mode, pathname *redirection) {
int inweb_mode, pathname *redirection, int parsing) {
web *W = CREATE(web);
W->path_to_web = P;
W->single_file = alt_F;
@ -70,7 +70,7 @@ web *Reader::load_web(pathname *P, filename *alt_F, module_search *I, int verbos
W->version_number = VersionNumbers::null();
Bibliographic::initialise_data(W);
Reader::add_tangle_target(W, Languages::default()); /* the bulk of the web is automatically a target */
Reader::read_contents_page(W, I, verbosely);
Reader::read_contents_page(W, I, verbosely, parsing);
BuildFiles::deduce_semver(W);
Parser::parse_web(W, inweb_mode);
if (W->no_sections == 1) {
@ -179,8 +179,8 @@ Because a contents page can, by importing a module, cause a further contents
page to be read, we set this up as a recursion:
=
void Reader::read_contents_page(web *W, module_search *import_path, int verbosely) {
Reader::read_contents_page_from(W, import_path, verbosely, NULL);
void Reader::read_contents_page(web *W, module_search *import_path, int verbosely, int parsing) {
Reader::read_contents_page_from(W, import_path, verbosely, parsing, NULL);
Bibliographic::check_required_data(W);
}
@ -203,12 +203,14 @@ typedef struct reader_state {
struct pathname *path_to; /* Where web material is being read from */
struct module_search *import_from; /* Where imported webs are */
int scan_verbosely;
int parsing;
int main_web_not_module; /* Reading the original web, or an included one? */
int halt_at_at; /* Used for reading contents pages of single-file webs */
int halted; /* Set when such a halt has occurred */
} reader_state;
void Reader::read_contents_page_from(web *W, module_search *import_path, int verbosely, pathname *path) {
void Reader::read_contents_page_from(web *W, module_search *import_path, int verbosely,
int parsing, pathname *path) {
reader_state RS;
@<Initialise the reader state@>;
@ -231,6 +233,7 @@ void Reader::read_contents_page_from(web *W, module_search *import_path, int ver
RS.chapter_folder_name = Str::new();
RS.titling_line_to_insert = Str::new();
RS.scan_verbosely = verbosely;
RS.parsing = parsing;
RS.path_to = path;
RS.import_from = import_path;
RS.halted = FALSE;
@ -435,16 +438,19 @@ we like a spoonful of syntactic sugar on our porridge, that's why.
Reader::add_imported_header(RS->current_web, HF);
this_is_a_chapter = FALSE;
} else if (Regexp::match(&mr, line, L"Import: (%c+)")) {
pathname *imported = Modules::find(RS->current_web, RS->import_from, mr.exp[0]);
if (imported == NULL) {
TEMPORARY_TEXT(err);
WRITE_TO(err, "unable to find module: %S", line);
Errors::in_text_file_S(err, tfp);
DISCARD_TEXT(err);
} else {
int save_syntax = RS->current_web->default_syntax;
Reader::read_contents_page_from(RS->current_web, RS->import_from, RS->scan_verbosely, imported);
RS->current_web->default_syntax = save_syntax;
if (RS->parsing) {
pathname *imported = Modules::find(RS->current_web, RS->import_from, mr.exp[0]);
if (imported == NULL) {
TEMPORARY_TEXT(err);
WRITE_TO(err, "unable to find module: %S", line);
Errors::in_text_file_S(err, tfp);
DISCARD_TEXT(err);
} else {
int save_syntax = RS->current_web->default_syntax;
Reader::read_contents_page_from(RS->current_web, RS->import_from,
RS->scan_verbosely, RS->parsing, imported);
RS->current_web->default_syntax = save_syntax;
}
}
this_is_a_chapter = FALSE;
} else if (Regexp::match(&mr, line, L"Chapter (%d+): %c+")) {
@ -520,10 +526,10 @@ we also read in and process its file.
if (sect->source_file_for_section == NULL)
@<Work out the filename of this section file@>;
Reader::read_file(RS->current_web, sect->source_file_for_section,
RS->titling_line_to_insert, sect, RS->scan_verbosely,
(filename_of_single_file_web)?TRUE:FALSE);
if (RS->parsing)
Reader::read_file(RS->current_web, sect->source_file_for_section,
RS->titling_line_to_insert, sect, RS->scan_verbosely,
(filename_of_single_file_web)?TRUE:FALSE);
@<Initialise the section structure@> =
if (filename_of_single_file_web) {

377
Chapter 6/Readme Writeme.w Normal file
View file

@ -0,0 +1,377 @@
[Readme::] Readme Writeme.
To construct Readme and similar files.
@ This is a very simple generator for |README.md| files, written in Markdown
syntax, but with a few macro expansions of our own. The prototype file, which
uses these extra macros, is expanded to the final file, which does not.
As we scan through the prototype file, we keep track of this:
=
typedef struct write_state {
struct text_stream *OUT;
struct linked_list *known_macros; /* of |macro| */
struct macro *current_definition;
struct macro_tokens *stack_frame;
} write_state;
void Readme::write(filename *from, filename *to) {
WRITE_TO(STDOUT, "write-me: %f --> %f\n", from, to);
write_state ws;
ws.current_definition = NULL;
ws.known_macros = NEW_LINKED_LIST(macro);
macro *V = Readme::new_macro(I"version", NULL, NULL);
ADD_TO_LINKED_LIST(V, macro, ws.known_macros);
macro *P = Readme::new_macro(I"purpose", NULL, NULL);
ADD_TO_LINKED_LIST(P, macro, ws.known_macros);
macro *A = Readme::new_macro(I"var", NULL, NULL);
ADD_TO_LINKED_LIST(A, macro, ws.known_macros);
ws.stack_frame = NULL;
text_stream file_to;
if (Streams::open_to_file(&file_to, to, UTF8_ENC) == FALSE)
Errors::fatal_with_file("can't write readme file", to);
ws.OUT = &file_to;
TextFiles::read(from, FALSE, "unable to read template file", TRUE,
&Readme::write_helper, NULL, (void *) &ws);
Streams::close(&file_to);
}
@ The file consists of definitions of macros, made one at a time, and
starting with |@define| and finishing with |@end|, and actual material.
=
void Readme::write_helper(text_stream *text, text_file_position *tfp, void *state) {
write_state *ws = (write_state *) state;
text_stream *OUT = ws->OUT;
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, text, L" *@end *")) {
if (ws->current_definition == NULL)
Errors::in_text_file("@end without @define", tfp);
else ws->current_definition = NULL;
} else if (ws->current_definition) {
if (Str::len(ws->current_definition->content) > 0)
WRITE_TO(ws->current_definition->content, "\n");
WRITE_TO(ws->current_definition->content, "%S", text);
} else if (Regexp::match(&mr, text, L" *@define (%i+)(%c*)")) {
if (ws->current_definition)
Errors::in_text_file("@define without @end", tfp);
else {
macro *M = Readme::new_macro(mr.exp[0], mr.exp[1], tfp);
ws->current_definition = M;
ADD_TO_LINKED_LIST(M, macro, ws->known_macros);
}
} else {
Readme::expand_material(ws, OUT, text, tfp);
Readme::expand_material(ws, OUT, I"\n", tfp);
}
Regexp::dispose_of(&mr);
}
@ The "content" of a macro is its definition, and the tokens are named
parameters.
=
typedef struct macro {
struct text_stream *name;
struct text_stream *content;
struct macro_tokens tokens;
MEMORY_MANAGEMENT
} macro;
macro *Readme::new_macro(text_stream *name, text_stream *tokens, text_file_position *tfp) {
macro *M = CREATE(macro);
M->name = Str::duplicate(name);
M->tokens = Readme::parse_token_list(tokens, tfp);
M->content = Str::new();
return M;
}
typedef struct macro_tokens {
struct macro *bound_to;
struct text_stream *pars[8];
int no_pars;
struct macro_tokens *down;
MEMORY_MANAGEMENT
} macro_tokens;
@ =
macro_tokens Readme::parse_token_list(text_stream *chunk, text_file_position *tfp) {
macro_tokens mt;
mt.no_pars = 0;
mt.down = NULL;
mt.bound_to = NULL;
if (Str::get_first_char(chunk) == '(') {
int x = 1, bl = 1, from = 1, quoted = FALSE;
while ((bl > 0) && (Str::get_at(chunk, x) != 0)) {
wchar_t c = Str::get_at(chunk, x);
if (c == '\'') {
quoted = quoted?FALSE:TRUE;
} else if (quoted == FALSE) {
if (c == '(') bl++;
else if (c == ')') {
bl--;
if (bl == 0) @<Recognise token@>;
} else if ((c == ',') && (bl == 1)) @<Recognise token@>;
}
x++;
}
Str::delete_n_characters(chunk, x);
}
return mt;
}
@ Quotes can be used in token lists so that literal commas and brackets can
be used without breaking the flow.
@<Recognise token@> =
int n = mt.no_pars;
if (n >= 8) Errors::in_text_file("too many parameters", tfp);
else {
mt.pars[n] = Str::new();
for (int j=from; j<x; j++) PUT_TO(mt.pars[n], Str::get_at(chunk, j));
Str::trim_white_space(mt.pars[n]);
if ((Str::get_first_char(mt.pars[n]) == '\'') &&
(Str::get_last_char(mt.pars[n]) == '\'')) {
Str::delete_first_character(mt.pars[n]);
Str::delete_last_character(mt.pars[n]);
}
mt.no_pars++;
}
from = x+1;
@ So much for creating macros. Now we can write the actual expander. As can
be seen, it passes material straight through, except for instances of the
notation |@name|, possibly followed by a bracketed list of parameters.
=
void Readme::expand_material(write_state *ws, text_stream *OUT, text_stream *text,
text_file_position *tfp) {
match_results mr = Regexp::create_mr();
if (Regexp::match(&mr, text, L"(%c*?)@(%i+)(%c*)")) {
Readme::expand_material(ws, OUT, mr.exp[0], tfp);
macro_tokens mt = Readme::parse_token_list(mr.exp[2], tfp);
mt.down = ws->stack_frame;
ws->stack_frame = &mt;
Readme::expand_at(ws, OUT, mr.exp[1], tfp);
ws->stack_frame = mt.down;
Readme::expand_material(ws, OUT, mr.exp[2], tfp);
} else {
WRITE("%S", text);
}
Regexp::dispose_of(&mr);
}
@ If we run into the notation |@something|, it's possible that |something| is
the name of a parameter somewhere in the current stack, either on the top
frame or on frames lower down. The first match wins... and if there are no
matches, then it must be a macro name.
=
void Readme::expand_at(write_state *ws, text_stream *OUT, text_stream *macro_name,
text_file_position *tfp) {
macro_tokens *stack = ws->stack_frame;
while (stack) {
macro *in = stack->bound_to;
if (in)
for (int n = 0; n < in->tokens.no_pars; n++)
if (Str::eq(in->tokens.pars[n], macro_name)) {
if (n < stack->no_pars) {
Readme::expand_material(ws, OUT, stack->pars[n], tfp);
return;
}
}
stack = stack->down;
}
macro *M;
LOOP_OVER_LINKED_LIST(M, macro, ws->known_macros)
if (Str::eq(M->name, macro_name)) {
ws->stack_frame->bound_to = M;
Readme::expand_macro(ws, OUT, M, tfp);
return;
}
Errors::in_text_file("no such @-command", tfp);
WRITE_TO(STDERR, "(command is '%S')\n", macro_name);
}
@ So, then: suppose we have to expand |@example(5, gold rings)|. Then the
|macro_name| below is set to |example|, and the current stack frame contains the
values |5| and |gold rings|.
=
void Readme::expand_macro(write_state *ws, text_stream *OUT, macro *M, text_file_position *tfp) {
if (Str::eq(M->name, I"version")) @<Perform built-in expansion of version macro@>
else if (Str::eq(M->name, I"purpose")) @<Perform built-in expansion of purpose macro@>
else if (Str::eq(M->name, I"var")) @<Perform built-in expansion of var macro@>
else {
ws->stack_frame->bound_to = M;
Readme::expand_material(ws, OUT, M->content, tfp);
}
}
@<Perform built-in expansion of version macro@> =
if (ws->stack_frame->no_pars != 1)
Errors::in_text_file("@version takes 1 parameter", tfp);
else {
TEMPORARY_TEXT(program);
Readme::expand_material(ws, program, ws->stack_frame->pars[0], tfp);
Readme::write_var(ws, OUT, program, I"Version Number", tfp);
DISCARD_TEXT(program);
}
@<Perform built-in expansion of purpose macro@> =
if (ws->stack_frame->no_pars != 1)
Errors::in_text_file("@purpose takes 1 parameter", tfp);
else {
TEMPORARY_TEXT(program);
Readme::expand_material(ws, program, ws->stack_frame->pars[0], tfp);
Readme::write_var(ws, OUT, program, I"Purpose", tfp);
DISCARD_TEXT(program);
}
@<Perform built-in expansion of var macro@> =
if (ws->stack_frame->no_pars != 2)
Errors::in_text_file("@var takes 2 parameters", tfp);
else {
TEMPORARY_TEXT(program);
TEMPORARY_TEXT(bibv);
Readme::expand_material(ws, program, ws->stack_frame->pars[0], tfp);
Readme::expand_material(ws, bibv, ws->stack_frame->pars[1], tfp);
Readme::write_var(ws, OUT, program, bibv, tfp);
DISCARD_TEXT(program);
DISCARD_TEXT(bibv);
}
@ An "asset" here is something for which we might want to write the version
number of, or some similar metadata for. Assets are usually webs, but can
also be a few other rather Inform-specific things; those have a more limited
range of bibliographic data, just the version and date (and we will not
assume that the version complies with any format).
=
typedef struct writeme_asset {
struct text_stream *name;
struct web *if_web;
struct text_stream *date;
struct text_stream *version;
int next_is_version;
MEMORY_MANAGEMENT
} writeme_asset;
void Readme::write_var(write_state *ws, text_stream *OUT,
text_stream *program, text_stream *datum, text_file_position *tfp) {
writeme_asset *A = Readme::find_asset(program);
if (A->if_web) WRITE("%S", Bibliographic::get_datum(A->if_web, datum));
else if (Str::eq(datum, I"Build Date")) WRITE("%S", A->date);
else if (Str::eq(datum, I"Version Number")) WRITE("%S", A->version);
}
@ That just leaves the business of inspecting assets to obtain their metadata.
=
writeme_asset *Readme::find_asset(text_stream *program) {
writeme_asset *A;
LOOP_OVER(A, writeme_asset) if (Str::eq(program, A->name)) return A;
A = CREATE(writeme_asset);
A->name = Str::duplicate(program);
A->if_web = NULL;
A->date = Str::new();
A->version = Str::new();
A->next_is_version = FALSE;
@<Read in the asset@>;
return A;
}
@<Read in the asset@> =
if (Str::ends_with_wide_string(program, L".i7x")) {
@<Read in the extension file@>;
} else {
filename *F = Filenames::in_folder(Pathnames::from_text(program), I"Contents.w");
if (TextFiles::exists(F)) {
A->if_web = Reader::load_web(Pathnames::from_text(program), NULL, NULL, FALSE,
V2_SYNTAX, NULL, FALSE);
} else {
filename *I6_vn = Filenames::in_folder(
Pathnames::subfolder(Pathnames::from_text(program), I"inform6"), I"header.h");
if (TextFiles::exists(I6_vn)) @<Read in I6 source header file@>;
filename *template_vn = Filenames::in_folder(Pathnames::from_text(program), I"(manifest).txt");
if (TextFiles::exists(template_vn)) @<Read in template manifest file@>;
filename *rmt_vn = Filenames::in_folder(Pathnames::from_text(program), I"README.txt");
if (TextFiles::exists(rmt_vn)) @<Read in README file@>;
rmt_vn = Filenames::in_folder(Pathnames::from_text(program), I"README.md");
if (TextFiles::exists(rmt_vn)) @<Read in README file@>;
}
}
@<Read in the extension file@> =
TextFiles::read(Filenames::from_text(program), FALSE, "unable to read extension", TRUE,
&Readme::extension_harvester, NULL, A);
@<Read in I6 source header file@> =
TextFiles::read(I6_vn, FALSE, "unable to read header file from I6 source", TRUE,
&Readme::header_harvester, NULL, A);
@<Read in template manifest file@> =
TextFiles::read(template_vn, FALSE, "unable to read manifest file from website template", TRUE,
&Readme::template_harvester, NULL, A);
@<Read in README file@> =
TextFiles::read(rmt_vn, FALSE, "unable to read README file from website template", TRUE,
&Readme::readme_harvester, NULL, A);
@ The format for the contents section of a web is documented in Inweb.
=
void Readme::extension_harvester(text_stream *text, text_file_position *tfp, void *state) {
writeme_asset *A = (writeme_asset *) state;
match_results mr = Regexp::create_mr();
if (Str::len(text) == 0) return;
if (Regexp::match(&mr, text, L" *Version (%c*?) of %c*begins here. *"))
A->version = Str::duplicate(mr.exp[0]);
Regexp::dispose_of(&mr);
}
@ Explicit code to read from |header.h| in the Inform 6 repository.
=
void Readme::header_harvester(text_stream *text, text_file_position *tfp, void *state) {
writeme_asset *A = (writeme_asset *) state;
match_results mr = Regexp::create_mr();
if (Str::len(text) == 0) return;
if (Regexp::match(&mr, text, L"#define RELEASE_NUMBER (%c*?) *"))
A->version = Str::duplicate(mr.exp[0]);
if (Regexp::match(&mr, text, L"#define RELEASE_DATE \"(%c*?)\" *"))
A->date = Str::duplicate(mr.exp[0]);
Regexp::dispose_of(&mr);
}
@ Explicit code to read from the manifest file of a website template.
=
void Readme::template_harvester(text_stream *text, text_file_position *tfp, void *state) {
writeme_asset *A = (writeme_asset *) state;
match_results mr = Regexp::create_mr();
if (Str::len(text) == 0) return;
if (Regexp::match(&mr, text, L"%[INTERPRETERVERSION%]")) {
A->next_is_version = TRUE;
} else if (A->next_is_version) {
A->version = Str::duplicate(text);
A->next_is_version = FALSE;
}
Regexp::dispose_of(&mr);
}
@ And this is needed for |cheapglk| and |glulxe| in the Inform repository.
=
void Readme::readme_harvester(text_stream *text, text_file_position *tfp, void *state) {
writeme_asset *A = (writeme_asset *) state;
match_results mr = Regexp::create_mr();
if (Str::len(text) == 0) return;
if ((Regexp::match(&mr, text, L"CheapGlk Library: version (%c*?) *")) ||
(Regexp::match(&mr, text, L"- Version (%c*?) *")))
A->version = Str::duplicate(mr.exp[0]);
Regexp::dispose_of(&mr);
}

View file

@ -68,4 +68,4 @@ Chapter 6: Extras
Makefiles
Git Support
Build Files
Readme Writeme

View file

@ -1,4 +1,6 @@
# Inweb version 7 'Escape to Danger'
# Inweb 7
v7-alpha.1+1A01 'Escape to Danger' (23 March 2020)
## About Inweb
@ -82,7 +84,6 @@ If you have also built Intest as "work/intest", then you can try these:
### Colophon
This README.mk file was generated automatically by Inpolicy (see the
[Inform repository](https://github.com/ganelson/inform)), and should not
This README.mk file was generated automatically by Inweb, and should not
be edited. To make changes, edit scripts/READMEscript.txt and re-generate.

File diff suppressed because it is too large Load diff

View file

@ -48,15 +48,17 @@ case, <code class="display"><span class="extract">_array_MT</span></code> append
<span class="definitionkeyword">enum</span> <span class="constant">breadcrumb_request_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">c_structure_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">chapter_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">para_macro_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">enumeration_set_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">function_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">hash_table_entry_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">hash_table_entry_usage_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">macro_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">macro_tokens_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">macro_usage_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">module_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">module_search_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">nonterminal_variable_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">para_macro_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">paragraph_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">paragraph_tagging_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">preform_nonterminal_MT</span>
@ -72,6 +74,7 @@ case, <code class="display"><span class="extract">_array_MT</span></code> append
<span class="definitionkeyword">enum</span> <span class="constant">weave_pattern_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">weave_target_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">web_MT</span>
<span class="definitionkeyword">enum</span> <span class="constant">writeme_asset_MT</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>And then expand the following macros, all defined in Foundation. This
makes all the necessary constructor functions for creating objects of these
@ -85,29 +88,32 @@ types.
<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">c_structure</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">chapter</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">para_macro</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">enumeration_set</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">function</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">hash_table_entry_usage</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">hash_table_entry</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">macro_tokens</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">macro_usage</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">module</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">module_search</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">module</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">nonterminal_variable</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">para_macro</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">paragraph_tagging</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">paragraph</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">preform_nonterminal</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">programming_language</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">tex_results</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">section</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">structure_element</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">tangle_target</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">tex_results</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">text_literal</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">theme_tag</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="reserved">(weave_format</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="reserved">(weave_pattern</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">weave_target</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">web</span><span class="plain">)</span>
<span class="identifier">ALLOCATE_INDIVIDUALLY</span><span class="plain">(</span><span class="reserved">writeme_asset</span><span class="plain">)</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -59,6 +59,7 @@ command line: there will only ever be one of these.
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">makefile_setting</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">-makefile X</span></code>: the filename X, if supplied</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">gitignore_setting</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">-gitignore X</span></code>: the filename X, if supplied</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">advance_setting</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">-advance-build-file X</span></code>: advance build file X</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">writeme_setting</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">-write-me X</span></code>: advance build file X</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">prototype_setting</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">-prototype X</span></code>: the pathname X, if supplied</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">navigation_setting</span><span class="plain">; </span> <span class="comment"><code class="display"><span class="extract">-navigation X</span></code>: the filename X, if supplied</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">linked_list</span><span class="plain"> *</span><span class="identifier">breadcrumb_setting</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">breadcrumb_request</span></code></span>
@ -135,6 +136,7 @@ then declare them.
<span class="identifier">args</span><span class="element">.makefile_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="element">.gitignore_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="element">.advance_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="element">.writeme_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="element">.prototype_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="element">.navigation_setting</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">args</span><span class="element">.breadcrumb_setting</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">breadcrumb_request</span><span class="plain">);</span>
@ -164,6 +166,7 @@ provides automatically.
<span class="definitionkeyword">enum</span> <span class="constant">ADVANCE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">GITIGNORE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">MAKEFILE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">WRITEME_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">ADVANCE_FILE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">PROTOTYPE_CLSW</span>
<span class="definitionkeyword">enum</span> <span class="constant">SCAN_CLSW</span>
@ -214,6 +217,8 @@ provides automatically.
<span class="identifier">L</span><span class="string">"write a .gitignore file for this web and store it in X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">ADVANCE_FILE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"advance-build-file"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"increment daily build code in file X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">WRITEME_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"write-me"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"write a read-me file following instructions in file X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">PROTOTYPE_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"prototype"</span><span class="plain">, 2,</span>
<span class="identifier">L</span><span class="string">"translate makefile from prototype X"</span><span class="plain">);</span>
<span class="functiontext">CommandLine::declare_switch</span><span class="plain">(</span><span class="constant">FUNCTIONS_CLSW</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"functions"</span><span class="plain">, 1,</span>
@ -292,6 +297,10 @@ provides automatically.
<span class="identifier">args</span><span class="plain">-</span><span class="element">&gt;advance_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">TRANSLATE_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="constant">WRITEME_CLSW</span><span class="plain">:</span>
<span class="identifier">args</span><span class="plain">-</span><span class="element">&gt;writeme_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">TRANSLATE_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="constant">PROTOTYPE_CLSW</span><span class="plain">:</span>
<span class="identifier">args</span><span class="plain">-</span><span class="element">&gt;prototype_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">TRANSLATE_MODE</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>

View file

@ -176,7 +176,7 @@ program: some input, some thinking, a choice of three forms of output.
<span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_web</span><span class="plain">) || (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_file</span><span class="plain">))</span>
<span class="identifier">W</span><span class="plain"> = </span><span class="functiontext">Reader::load_web</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_web</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;chosen_file</span><span class="plain">,</span>
<span class="functiontext">Modules::make_search_path</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;import_setting</span><span class="plain">), </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;verbose_switch</span><span class="plain">,</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</span><span class="plain">);</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;weave_into_setting</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">no_inweb_errors</span><span class="plain"> == 0) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain"> == </span><span class="constant">TRANSLATE_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Translate a makefile</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;inweb_mode</span><span class="plain"> != </span><span class="constant">NO_MODE</span><span class="plain">) </span>&lt;<span class="cwebmacro">Analyse, tangle or weave an existing web</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
@ -202,12 +202,16 @@ program: some input, some thinking, a choice of three forms of output.
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"makescript.txt"</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">&gt;gitignore_setting</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"gitignorescript.txt"</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">&gt;writeme_setting</span><span class="plain">) &amp;&amp; (</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">))</span>
<span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"READMEscript.txt"</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">&gt;makefile_setting</span><span class="plain">)</span>
<span class="functiontext">Makefiles::write</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">&gt;prototype_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;makefile_setting</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">&gt;gitignore_setting</span><span class="plain">)</span>
<span class="functiontext">Git::write_gitignore</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">&gt;prototype_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;gitignore_setting</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">&gt;advance_setting</span><span class="plain">)</span>
<span class="functiontext">BuildFiles::advance</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;advance_setting</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">&gt;writeme_setting</span><span class="plain">)</span>
<span class="functiontext">Readme::write</span><span class="plain">(</span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;prototype_setting</span><span class="plain">, </span><span class="identifier">ins</span><span class="plain">-</span><span class="element">&gt;writeme_setting</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -175,7 +175,7 @@ to check that all the mandatory declarations have indeed been made:
<p class="inwebparagraph"></p>
<p class="endnote">The function Bibliographic::get_datum is used in 1/pc (<a href="1-pc.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="1-pc.html#SP7_2_3_1">&#167;7.2.3.1</a>), 2/tr (<a href="2-tr.html#SP4">&#167;4</a>, <a href="2-tr.html#SP9_3_1">&#167;9.3.1</a>, <a href="2-tr.html#SP9_3_3_2_1">&#167;9.3.3.2.1</a>, <a href="2-tr.html#SP9_2_2_3_1">&#167;9.2.2.3.1</a>), 3/ti (<a href="3-ti.html#SP2_1_4">&#167;2.1.4</a>, <a href="3-ti.html#SP5_1_8_1">&#167;5.1.8.1</a>), 3/tw (<a href="3-tw.html#SP1_3_3_1_10_4">&#167;1.3.3.1.10.4</a>), 3/tt (<a href="3-tt.html#SP3_2">&#167;3.2</a>), 4/cl (<a href="4-cl.html#SP22">&#167;22</a>), 4/is (<a href="4-is.html#SP13">&#167;13</a>), 5/hf (<a href="5-hf.html#SP9">&#167;9</a>, <a href="5-hf.html#SP27">&#167;27</a>), 6/bf2 (<a href="6-bf2.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Bibliographic::get_datum is used in 1/pc (<a href="1-pc.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="1-pc.html#SP7_2_3_1">&#167;7.2.3.1</a>), 2/tr (<a href="2-tr.html#SP4">&#167;4</a>, <a href="2-tr.html#SP9_3_1">&#167;9.3.1</a>, <a href="2-tr.html#SP9_3_3_2_1">&#167;9.3.3.2.1</a>, <a href="2-tr.html#SP9_2_2_3_1">&#167;9.2.2.3.1</a>), 3/ti (<a href="3-ti.html#SP2_1_4">&#167;2.1.4</a>, <a href="3-ti.html#SP5_1_8_1">&#167;5.1.8.1</a>), 3/tw (<a href="3-tw.html#SP1_3_3_1_10_4">&#167;1.3.3.1.10.4</a>), 3/tt (<a href="3-tt.html#SP3_2">&#167;3.2</a>), 4/cl (<a href="4-cl.html#SP22">&#167;22</a>), 4/is (<a href="4-is.html#SP13">&#167;13</a>), 5/hf (<a href="5-hf.html#SP9">&#167;9</a>, <a href="5-hf.html#SP27">&#167;27</a>), 6/bf2 (<a href="6-bf2.html#SP6">&#167;6</a>), 6/rw (<a href="6-rw.html#SP8">&#167;8</a>).</p>
<p class="endnote">The function Bibliographic::data_exists is used in 1/pc (<a href="1-pc.html#SP7_2_2_1">&#167;7.2.2.1</a>, <a href="1-pc.html#SP7_2_3_1">&#167;7.2.3.1</a>), 1/ptt (<a href="1-ptt.html#SP3_2">&#167;3.2</a>), 3/ts (<a href="3-ts.html#SP3">&#167;3</a>), 3/ti (<a href="3-ti.html#SP2_1">&#167;2.1</a>, <a href="3-ti.html#SP5_1_8">&#167;5.1.8</a>), 3/tw (<a href="3-tw.html#SP1_2">&#167;1.2</a>, <a href="3-tw.html#SP1_4">&#167;1.4</a>), 4/is (<a href="4-is.html#SP13">&#167;13</a>).</p>

View file

@ -86,7 +86,7 @@ multi-chapter web.
<pre class="display">
<span class="reserved">web</span><span class="plain"> *</span><span class="functiontext">Reader::load_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">filename</span><span class="plain"> *</span><span class="identifier">alt_F</span><span class="plain">, </span><span class="reserved">module_search</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">verbosely</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="reserved">pathname</span><span class="plain"> *</span><span class="identifier">redirection</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="reserved">pathname</span><span class="plain"> *</span><span class="identifier">redirection</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">parsing</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">CREATE</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="element">&gt;path_to_web</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;single_file</span><span class="plain"> = </span><span class="identifier">alt_F</span><span class="plain">;</span>
@ -106,7 +106,7 @@ multi-chapter web.
<span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;version_number</span><span class="plain"> = </span><span class="functiontext">VersionNumbers::null</span><span class="plain">();</span>
<span class="functiontext">Bibliographic::initialise_data</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="functiontext">Reader::add_tangle_target</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="functiontext">Languages::default</span><span class="plain">()); </span> <span class="comment">the bulk of the web is automatically a target</span>
<span class="functiontext">Reader::read_contents_page</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">verbosely</span><span class="plain">);</span>
<span class="functiontext">Reader::read_contents_page</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">I</span><span class="plain">, </span><span class="identifier">verbosely</span><span class="plain">, </span><span class="identifier">parsing</span><span class="plain">);</span>
<span class="functiontext">BuildFiles::deduce_semver</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="functiontext">Parser::parse_web</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">inweb_mode</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">W</span><span class="plain">-</span><span class="element">&gt;no_sections</span><span class="plain"> == 1) {</span>
@ -120,7 +120,7 @@ multi-chapter web.
<p class="inwebparagraph"></p>
<p class="endnote">The function Reader::load_web is used in 1/pc (<a href="1-pc.html#SP7">&#167;7</a>).</p>
<p class="endnote">The function Reader::load_web is used in 1/pc (<a href="1-pc.html#SP7">&#167;7</a>), 6/rw (<a href="6-rw.html#SP9_1">&#167;9.1</a>).</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>We abstract these in order to be able to respond well to their not existing:
</p>
@ -251,8 +251,8 @@ page to be read, we set this up as a recursion:
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Reader::read_contents_page</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">module_search</span><span class="plain"> *</span><span class="identifier">import_path</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbosely</span><span class="plain">) {</span>
<span class="functiontext">Reader::read_contents_page_from</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">import_path</span><span class="plain">, </span><span class="identifier">verbosely</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">Reader::read_contents_page</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">module_search</span><span class="plain"> *</span><span class="identifier">import_path</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbosely</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">parsing</span><span class="plain">) {</span>
<span class="functiontext">Reader::read_contents_page_from</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">, </span><span class="identifier">import_path</span><span class="plain">, </span><span class="identifier">verbosely</span><span class="plain">, </span><span class="identifier">parsing</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">Bibliographic::check_required_data</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
@ -283,12 +283,14 @@ by halting at the junction point.
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path_to</span><span class="plain">; </span> <span class="comment">Where web material is being read from</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">module_search</span><span class="plain"> *</span><span class="identifier">import_from</span><span class="plain">; </span> <span class="comment">Where imported webs are</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">scan_verbosely</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parsing</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">main_web_not_module</span><span class="plain">; </span> <span class="comment">Reading the original web, or an included one?</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">halt_at_at</span><span class="plain">; </span> <span class="comment">Used for reading contents pages of single-file webs</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">halted</span><span class="plain">; </span> <span class="comment">Set when such a halt has occurred</span>
<span class="plain">} </span><span class="reserved">reader_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Reader::read_contents_page_from</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">module_search</span><span class="plain"> *</span><span class="identifier">import_path</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbosely</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Reader::read_contents_page_from</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">module_search</span><span class="plain"> *</span><span class="identifier">import_path</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">verbosely</span><span class="plain">,</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">parsing</span><span class="plain">, </span><span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">path</span><span class="plain">) {</span>
<span class="reserved">reader_state</span><span class="plain"> </span><span class="identifier">RS</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Initialise the reader state</span> <span class="cwebmacronumber">8.1</span>&gt;<span class="plain">;</span>
@ -323,6 +325,7 @@ by halting at the junction point.
<span class="identifier">RS</span><span class="element">.chapter_folder_name</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">RS</span><span class="element">.titling_line_to_insert</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">RS</span><span class="element">.scan_verbosely</span><span class="plain"> = </span><span class="identifier">verbosely</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="element">.parsing</span><span class="plain"> = </span><span class="identifier">parsing</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="element">.path_to</span><span class="plain"> = </span><span class="identifier">path</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="element">.import_from</span><span class="plain"> = </span><span class="identifier">import_path</span><span class="plain">;</span>
<span class="identifier">RS</span><span class="element">.halted</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
@ -640,16 +643,19 @@ we like a spoonful of syntactic sugar on our porridge, that's why.
<span class="functiontext">Reader::add_imported_header</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">, </span><span class="identifier">HF</span><span class="plain">);</span>
<span class="identifier">this_is_a_chapter</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Import: (%c+)"</span><span class="plain">)) {</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">imported</span><span class="plain"> = </span><span class="functiontext">Modules::find</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;import_from</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">imported</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"unable to find module: %S"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">save_syntax</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">-</span><span class="element">&gt;default_syntax</span><span class="plain">;</span>
<span class="functiontext">Reader::read_contents_page_from</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;import_from</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;scan_verbosely</span><span class="plain">, </span><span class="identifier">imported</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">-</span><span class="element">&gt;default_syntax</span><span class="plain"> = </span><span class="identifier">save_syntax</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;parsing</span><span class="plain">) {</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">imported</span><span class="plain"> = </span><span class="functiontext">Modules::find</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;import_from</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">imported</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="string">"unable to find module: %S"</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">);</span>
<span class="functiontext">Errors::in_text_file_S</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">err</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">save_syntax</span><span class="plain"> = </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">-</span><span class="element">&gt;default_syntax</span><span class="plain">;</span>
<span class="functiontext">Reader::read_contents_page_from</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;import_from</span><span class="plain">,</span>
<span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;scan_verbosely</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;parsing</span><span class="plain">, </span><span class="identifier">imported</span><span class="plain">);</span>
<span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">-</span><span class="element">&gt;default_syntax</span><span class="plain"> = </span><span class="identifier">save_syntax</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">this_is_a_chapter</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">line</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"Chapter (%d+): %c+"</span><span class="plain">)) {</span>
@ -759,10 +765,10 @@ we also read in and process its file.
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">sect</span><span class="plain">-</span><span class="element">&gt;source_file_for_section</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
&lt;<span class="cwebmacro">Work out the filename of this section file</span> <span class="cwebmacronumber">9.2.2.4</span>&gt;<span class="plain">;</span>
<span class="functiontext">Reader::read_file</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">, </span><span class="identifier">sect</span><span class="plain">-</span><span class="element">&gt;source_file_for_section</span><span class="plain">,</span>
<span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;titling_line_to_insert</span><span class="plain">, </span><span class="identifier">sect</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;scan_verbosely</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">filename_of_single_file_web</span><span class="plain">)?</span><span class="constant">TRUE</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">RS</span><span class="plain">-</span><span class="element">&gt;parsing</span><span class="plain">)</span>
<span class="functiontext">Reader::read_file</span><span class="plain">(</span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;current_web</span><span class="plain">, </span><span class="identifier">sect</span><span class="plain">-</span><span class="element">&gt;source_file_for_section</span><span class="plain">,</span>
<span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;titling_line_to_insert</span><span class="plain">, </span><span class="identifier">sect</span><span class="plain">, </span><span class="identifier">RS</span><span class="plain">-</span><span class="element">&gt;scan_verbosely</span><span class="plain">,</span>
<span class="plain">(</span><span class="identifier">filename_of_single_file_web</span><span class="plain">)?</span><span class="constant">TRUE</span><span class="plain">:</span><span class="constant">FALSE</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>

View file

@ -1016,13 +1016,13 @@ we also look out for <code class="display"><span class="extract">{}^3\sqrt{N}</s
<pre class="displaydefn">
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">Characters::isalpha</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">i</span><span class="plain">))))</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">macro</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">i</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">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"not"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Remove the not prefix</span> <span class="cwebmacronumber">28.4.2</span>&gt;
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="reserved">macro</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">i</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="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"not"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Remove the not prefix</span> <span class="cwebmacronumber">28.4.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span>&lt;<span class="cwebmacro">Remove a general macro</span> <span class="cwebmacronumber">28.4.1</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">--;</span>
</pre>
@ -1036,103 +1036,103 @@ we also look out for <code class="display"><span class="extract">{}^3\sqrt{N}</s
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"leq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;="</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"geq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&gt;="</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sim"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"~"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"hbox"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"left"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"right"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"=&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Leftrightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;=&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"to"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"longrightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"leftarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;--"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"longleftarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;--"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lbrace"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"{"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"mid"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rbrace"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cdot"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cdots"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"..."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"dots"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"..."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"times"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"*"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"quad"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"qquad"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"TeX"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"TeX"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"neq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"!="</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"noteq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"!="</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"ell"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"l"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"log"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"log"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exp"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"exp"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sin"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"sin"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cos"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"cos"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"tan"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"tan"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"top"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"T"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Alpha"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0391</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Beta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0392</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Gamma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0393</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Delta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0394</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Epsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0395</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Zeta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0396</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Eta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0397</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Theta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0398</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Iota"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0399</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kappa"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039A</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lambda"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039B</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Mu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039C</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Nu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039D</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Xi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039E</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Omicron"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039F</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Pi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A0</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rho"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A1</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Varsigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A2</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A3</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tau"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A4</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Upsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A5</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A6</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Chi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A7</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Psi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A8</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Omega"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A9</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"alpha"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B1</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"beta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B2</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"gamma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B3</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"delta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B4</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"epsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B5</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"zeta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B6</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"eta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B7</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"theta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B8</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"iota"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B9</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kappa"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BA</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lambda"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BB</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"mu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BC</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"nu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BD</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"xi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"omicron"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BF</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"pi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C0</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rho"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C1</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"varsigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C2</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C3</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"tau"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C4</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"upsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C5</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"phi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C6</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"chi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C7</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"psi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C8</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"omega"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C9</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exists"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2203</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"in"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2208</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"forall"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2200</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cap"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2229</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"emptyset"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2205</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"subseteq"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2286</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"land"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2227</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lor"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2228</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lnot"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x00AC</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sum"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A3</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"prod"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A0</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="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"leq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;="</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"geq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&gt;="</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sim"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"~"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"hbox"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"left"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"right"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">""</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"=&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Leftrightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;=&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"to"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"longrightarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"--&gt;"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"leftarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;--"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"longleftarrow"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"&lt;--"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lbrace"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"{"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"mid"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"|"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rbrace"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"}"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cdot"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cdots"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"..."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"dots"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"..."</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"times"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"*"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"quad"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"qquad"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" "</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"TeX"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"TeX"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"neq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"!="</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"noteq"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"!="</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"ell"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"l"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"log"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"log"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exp"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"exp"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sin"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"sin"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cos"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"cos"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"tan"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"tan"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"top"</span><span class="plain">)) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"T"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Alpha"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0391</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Beta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0392</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Gamma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0393</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Delta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0394</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Epsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0395</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Zeta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0396</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Eta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0397</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Theta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0398</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Iota"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x0399</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Kappa"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039A</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Lambda"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039B</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Mu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039C</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Nu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039D</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Xi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039E</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Omicron"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x039F</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Pi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A0</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Rho"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A1</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Varsigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A2</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Sigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A3</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Tau"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A4</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Upsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A5</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Phi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A6</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Chi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A7</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Psi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A8</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Omega"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A9</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"alpha"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B1</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"beta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B2</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"gamma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B3</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"delta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B4</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"epsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B5</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"zeta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B6</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"eta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B7</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"theta"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B8</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"iota"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03B9</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"kappa"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BA</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lambda"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BB</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"mu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BC</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"nu"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BD</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"xi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BE</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"omicron"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03BF</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"pi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C0</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"rho"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C1</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"varsigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C2</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sigma"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C3</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"tau"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C4</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"upsilon"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C5</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"phi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C6</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"chi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C7</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"psi"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C8</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"omega"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03C9</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exists"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2203</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"in"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2208</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"forall"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2200</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"cap"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2229</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"emptyset"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2205</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"subseteq"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2286</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"land"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2227</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lor"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2228</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"lnot"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x00AC</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"sum"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A3</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"prod"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x03A0</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">) &gt; 0)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Passing through unknown TeX macro \</span><span class="plain">\</span><span class="string">%S: %S"</span><span class="plain">, </span><span class="identifier">macro</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">"\</span><span class="plain">\</span><span class="string">%S"</span><span class="plain">, </span><span class="identifier">macro</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="reserved">macro</span><span class="plain">) &gt; 0)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Passing through unknown TeX macro \</span><span class="plain">\</span><span class="string">%S: %S"</span><span class="plain">, </span><span class="reserved">macro</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">"\</span><span class="plain">\</span><span class="string">%S"</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
@ -1151,14 +1151,14 @@ we also look out for <code class="display"><span class="extract">{}^3\sqrt{N}</s
<pre class="displaydefn">
<span class="reserved">if</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">i</span><span class="plain">) == </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">) {</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">);</span>
<span class="functiontext">Str::clear</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">);</span>
<span class="identifier">i</span><span class="plain">++;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">i</span><span class="plain"> &lt; </span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">)) &amp;&amp; (</span><span class="functiontext">Characters::isalpha</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">i</span><span class="plain">))))</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">macro</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">i</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">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exists"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2204</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"forall"</span><span class="plain">)) { </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x00AC</span><span class="plain">); </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2200</span><span class="plain">); }</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="reserved">macro</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">i</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="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"exists"</span><span class="plain">)) </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2204</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"forall"</span><span class="plain">)) { </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x00AC</span><span class="plain">); </span><span class="identifier">PUT</span><span class="plain">((</span><span class="identifier">wchar_t</span><span class="plain">) 0</span><span class="identifier">x2200</span><span class="plain">); }</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Don't know how to apply '\</span><span class="plain">\</span><span class="string">not' to '\</span><span class="plain">\</span><span class="string">%S'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">macro</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Don't know how to apply '\</span><span class="plain">\</span><span class="string">not' to '\</span><span class="plain">\</span><span class="string">%S'\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"Don't know how to apply '\</span><span class="plain">\</span><span class="string">not' here\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>

View file

@ -290,7 +290,7 @@ some 58 years.
<p class="endnote">The function BuildFiles::increment is used in <a href="#SP7">&#167;7</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="6-gs.html">Back to 'Git Support'</a></li><li><i>(This section ends Chapter 6: Extras.)</i></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="6-gs.html">Back to 'Git Support'</a></li><li><a href="6-rw.html">Continue with 'Readme Writeme'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>

602
docs/inweb/6-rw.html Normal file
View file

@ -0,0 +1,602 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>6/bf2</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../inweb/index.html">inweb</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../foundation-module/index.html">foundation-module</a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '6/rw' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#6">Chapter 6: Extras</a></li><li><b>Readme Writeme</b></li></ul><p class="purpose">To construct Readme and similar files.</p>
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>This is a very simple generator for <code class="display"><span class="extract">README.md</span></code> files, written in Markdown
syntax, but with a few macro expansions of our own. The prototype file, which
uses these extra macros, is expanded to the final file, which does not.
</p>
<p class="inwebparagraph">As we scan through the prototype file, we keep track of this:
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">write_state</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">OUT</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">known_macros</span><span class="plain">; </span> <span class="comment">of <code class="display"><span class="extract">macro</span></code></span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">current_definition</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">macro_tokens</span><span class="plain"> *</span><span class="identifier">stack_frame</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">write_state</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::write</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="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDOUT</span><span class="plain">, </span><span class="string">"write-me: %f --&gt; %f\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">from</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">);</span>
<span class="reserved">write_state</span><span class="plain"> </span><span class="identifier">ws</span><span class="plain">;</span>
<span class="identifier">ws</span><span class="element">.current_definition</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">ws</span><span class="element">.known_macros</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">macro</span><span class="plain">);</span>
<span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">V</span><span class="plain"> = </span><span class="functiontext">Readme::new_macro</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"version"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">V</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">ws</span><span class="element">.known_macros</span><span class="plain">);</span>
<span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="functiontext">Readme::new_macro</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"purpose"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">ws</span><span class="element">.known_macros</span><span class="plain">);</span>
<span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="functiontext">Readme::new_macro</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"var"</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">ws</span><span class="element">.known_macros</span><span class="plain">);</span>
<span class="identifier">ws</span><span class="element">.stack_frame</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">file_to</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Streams::open_to_file</span><span class="plain">(&amp;</span><span class="identifier">file_to</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">, </span><span class="constant">UTF8_ENC</span><span class="plain">) == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="functiontext">Errors::fatal_with_file</span><span class="plain">(</span><span class="string">"can't write readme file"</span><span class="plain">, </span><span class="identifier">to</span><span class="plain">);</span>
<span class="identifier">ws</span><span class="element">.OUT</span><span class="plain"> = &amp;</span><span class="identifier">file_to</span><span class="plain">;</span>
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">from</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read template file"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
<span class="plain">&amp;</span><span class="functiontext">Readme::write_helper</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, (</span><span class="reserved">void</span><span class="plain"> *) &amp;</span><span class="identifier">ws</span><span class="plain">);</span>
<span class="functiontext">Streams::close</span><span class="plain">(&amp;</span><span class="identifier">file_to</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::write is used in 1/pc (<a href="1-pc.html#SP7_1">&#167;7.1</a>).</p>
<p class="endnote">The structure write_state is private to this section.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The file consists of definitions of macros, made one at a time, and
starting with <code class="display"><span class="extract">@define</span></code> and finishing with <code class="display"><span class="extract">@end</span></code>, and actual material.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::write_helper</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">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">state</span><span class="plain">) {</span>
<span class="reserved">write_state</span><span class="plain"> *</span><span class="identifier">ws</span><span class="plain"> = (</span><span class="reserved">write_state</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">OUT</span><span class="plain"> = </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;OUT</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *@end *"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;current_definition</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="string">"@end without @define"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;current_definition</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;current_definition</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">ws</span><span class="plain">-</span><span class="element">&gt;current_definition</span><span class="plain">-</span><span class="element">&gt;content</span><span class="plain">) &gt; 0)</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;current_definition</span><span class="plain">-</span><span class="element">&gt;content</span><span class="plain">, </span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;current_definition</span><span class="plain">-</span><span class="element">&gt;content</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *@define (%i+)(%c*)"</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;current_definition</span><span class="plain">)</span>
<span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="string">"@define without @end"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain"> = </span><span class="functiontext">Readme::new_macro</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;current_definition</span><span class="plain"> = </span><span class="identifier">M</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;known_macros</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::write_helper is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>The "content" of a macro is its definition, and the tokens are named
parameters.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">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">name</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">content</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">macro_tokens</span><span class="plain"> </span><span class="identifier">tokens</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">macro</span><span class="plain">;</span>
<span class="reserved">macro</span><span class="plain"> *</span><span class="functiontext">Readme::new_macro</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">text_stream</span><span class="plain"> *</span><span class="identifier">tokens</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">macro</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">macro</span><span class="plain">);</span>
<span class="identifier">M</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">name</span><span class="plain">);</span>
<span class="identifier">M</span><span class="plain">-</span><span class="element">&gt;tokens</span><span class="plain"> = </span><span class="functiontext">Readme::parse_token_list</span><span class="plain">(</span><span class="identifier">tokens</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">M</span><span class="plain">-</span><span class="element">&gt;content</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">M</span><span class="plain">;</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">macro_tokens</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">bound_to</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">pars</span><span class="plain">[8];</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">no_pars</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">macro_tokens</span><span class="plain"> *</span><span class="identifier">down</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">macro_tokens</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::new_macro is used in <a href="#SP1">&#167;1</a>, <a href="#SP2">&#167;2</a>.</p>
<p class="endnote">The structure macro is private to this section.</p>
<p class="endnote">The structure macro_tokens is private to this section.</p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b></p>
<pre class="display">
<span class="reserved">macro_tokens</span><span class="plain"> </span><span class="functiontext">Readme::parse_token_list</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">chunk</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">macro_tokens</span><span class="plain"> </span><span class="identifier">mt</span><span class="plain">;</span>
<span class="identifier">mt</span><span class="element">.no_pars</span><span class="plain"> = 0;</span>
<span class="identifier">mt</span><span class="element">.down</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">mt</span><span class="element">.bound_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="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">) == </span><span class="character">'('</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">x</span><span class="plain"> = 1, </span><span class="identifier">bl</span><span class="plain"> = 1, </span><span class="identifier">from</span><span class="plain"> = 1, </span><span class="identifier">quoted</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> ((</span><span class="identifier">bl</span><span class="plain"> &gt; 0) &amp;&amp; (</span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">) != 0)) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">chunk</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">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">) {</span>
<span class="identifier">quoted</span><span class="plain"> = </span><span class="identifier">quoted</span><span class="plain">?</span><span class="constant">FALSE</span><span class="plain">:</span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">quoted</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">c</span><span class="plain"> == </span><span class="character">'('</span><span class="plain">) </span><span class="identifier">bl</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">c</span><span class="plain"> == </span><span class="character">')'</span><span class="plain">) {</span>
<span class="identifier">bl</span><span class="plain">--;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">bl</span><span class="plain"> == 0) </span>&lt;<span class="cwebmacro">Recognise token</span> <span class="cwebmacronumber">4.1</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> ((</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">','</span><span class="plain">) &amp;&amp; (</span><span class="identifier">bl</span><span class="plain"> == 1)) </span>&lt;<span class="cwebmacro">Recognise token</span> <span class="cwebmacronumber">4.1</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">x</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="functiontext">Str::delete_n_characters</span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">, </span><span class="identifier">x</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">mt</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::parse_token_list is used in <a href="#SP3">&#167;3</a>, <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP4_1"></a><b>&#167;4.1. </b>Quotes can be used in token lists so that literal commas and brackets can
be used without breaking the flow.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Recognise token</span> <span class="cwebmacronumber">4.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">n</span><span class="plain"> = </span><span class="identifier">mt</span><span class="element">.no_pars</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> &gt;= 8) </span><span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="string">"too many parameters"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">mt</span><span class="element">.pars</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">] = </span><span class="functiontext">Str::new</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">from</span><span class="plain">; </span><span class="identifier">j</span><span class="plain">&lt;</span><span class="identifier">x</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">mt</span><span class="element">.pars</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">], </span><span class="functiontext">Str::get_at</span><span class="plain">(</span><span class="identifier">chunk</span><span class="plain">, </span><span class="identifier">j</span><span class="plain">));</span>
<span class="functiontext">Str::trim_white_space</span><span class="plain">(</span><span class="identifier">mt</span><span class="element">.pars</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="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">mt</span><span class="element">.pars</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">]) == </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">) &amp;&amp;</span>
<span class="plain">(</span><span class="functiontext">Str::get_last_char</span><span class="plain">(</span><span class="identifier">mt</span><span class="element">.pars</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">]) == </span><span class="character">'\</span><span class="plain">'</span><span class="character">'</span><span class="plain">)) {</span>
<span class="functiontext">Str::delete_first_character</span><span class="plain">(</span><span class="identifier">mt</span><span class="element">.pars</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">]);</span>
<span class="functiontext">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">mt</span><span class="element">.pars</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">]);</span>
<span class="plain">}</span>
<span class="identifier">mt</span><span class="element">.no_pars</span><span class="plain">++;</span>
<span class="plain">}</span>
<span class="identifier">from</span><span class="plain"> = </span><span class="identifier">x</span><span class="plain">+1;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP4">&#167;4</a> (twice).</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>So much for creating macros. Now we can write the actual expander. As can
be seen, it passes material straight through, except for instances of the
notation <code class="display"><span class="extract">@name</span></code>, possibly followed by a bracketed list of parameters.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="reserved">write_state</span><span class="plain"> *</span><span class="identifier">ws</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">text</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">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"(%c*?)@(%i+)(%c*)"</span><span class="plain">)) {</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">macro_tokens</span><span class="plain"> </span><span class="identifier">mt</span><span class="plain"> = </span><span class="functiontext">Readme::parse_token_list</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">mt</span><span class="element">.down</span><span class="plain"> = </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">;</span>
<span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain"> = &amp;</span><span class="identifier">mt</span><span class="plain">;</span>
<span class="functiontext">Readme::expand_at</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain"> = </span><span class="identifier">mt</span><span class="element">.down</span><span class="plain">;</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</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">text</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::expand_material is used in <a href="#SP2">&#167;2</a>, <a href="#SP6">&#167;6</a>, <a href="#SP7">&#167;7</a>, <a href="#SP7_1">&#167;7.1</a>, <a href="#SP7_2">&#167;7.2</a>, <a href="#SP7_3">&#167;7.3</a>.</p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. </b>If we run into the notation <code class="display"><span class="extract">@something</span></code>, it's possible that <code class="display"><span class="extract">something</span></code> is
the name of a parameter somewhere in the current stack, either on the top
frame or on frames lower down. The first match wins... and if there are no
matches, then it must be a macro name.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::expand_at</span><span class="plain">(</span><span class="reserved">write_state</span><span class="plain"> *</span><span class="identifier">ws</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">macro_name</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">macro_tokens</span><span class="plain"> *</span><span class="identifier">stack</span><span class="plain"> = </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">stack</span><span class="plain">) {</span>
<span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">in</span><span class="plain"> = </span><span class="identifier">stack</span><span class="plain">-</span><span class="element">&gt;bound_to</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">in</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">n</span><span class="plain"> = 0; </span><span class="identifier">n</span><span class="plain"> &lt; </span><span class="identifier">in</span><span class="plain">-</span><span class="element">&gt;tokens.no_pars</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="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">in</span><span class="plain">-</span><span class="element">&gt;tokens.pars</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">], </span><span class="identifier">macro_name</span><span class="plain">)) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">n</span><span class="plain"> &lt; </span><span class="identifier">stack</span><span class="plain">-</span><span class="element">&gt;no_pars</span><span class="plain">) {</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">stack</span><span class="plain">-</span><span class="element">&gt;pars</span><span class="plain">[</span><span class="identifier">n</span><span class="plain">], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="identifier">stack</span><span class="plain"> = </span><span class="identifier">stack</span><span class="plain">-</span><span class="element">&gt;down</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">M</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain">, </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;known_macros</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">M</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="identifier">macro_name</span><span class="plain">)) {</span>
<span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;bound_to</span><span class="plain"> = </span><span class="identifier">M</span><span class="plain">;</span>
<span class="functiontext">Readme::expand_macro</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="string">"no such @-command"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="constant">STDERR</span><span class="plain">, </span><span class="string">"(command is '%S')\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">macro_name</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::expand_at is used in <a href="#SP5">&#167;5</a>.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. </b>So, then: suppose we have to expand <code class="display"><span class="extract">@example(5, gold rings)</span></code>. Then the
<code class="display"><span class="extract">macro_name</span></code> below is set to <code class="display"><span class="extract">example</span></code>, and the current stack frame contains the
values <code class="display"><span class="extract">5</span></code> and <code class="display"><span class="extract">gold rings</span></code>.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::expand_macro</span><span class="plain">(</span><span class="reserved">write_state</span><span class="plain"> *</span><span class="identifier">ws</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">, </span><span class="reserved">macro</span><span class="plain"> *</span><span class="identifier">M</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">M</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"version"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Perform built-in expansion of version macro</span> <span class="cwebmacronumber">7.1</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"purpose"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Perform built-in expansion of purpose macro</span> <span class="cwebmacronumber">7.2</span>&gt;
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">M</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"var"</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Perform built-in expansion of var macro</span> <span class="cwebmacronumber">7.3</span>&gt;
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;bound_to</span><span class="plain"> = </span><span class="identifier">M</span><span class="plain">;</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">M</span><span class="plain">-</span><span class="element">&gt;content</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::expand_macro is used in <a href="#SP6">&#167;6</a>.</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform built-in expansion of version macro</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;no_pars</span><span class="plain"> != 1)</span>
<span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="string">"@version takes 1 parameter"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">);</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">program</span><span class="plain">, </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;pars</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="functiontext">Readme::write_var</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">program</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Version Number"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform built-in expansion of purpose macro</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;no_pars</span><span class="plain"> != 1)</span>
<span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="string">"@purpose takes 1 parameter"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">);</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">program</span><span class="plain">, </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;pars</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="functiontext">Readme::write_var</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">program</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Purpose"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_3"></a><b>&#167;7.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Perform built-in expansion of var macro</span> <span class="cwebmacronumber">7.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;no_pars</span><span class="plain"> != 2)</span>
<span class="functiontext">Errors::in_text_file</span><span class="plain">(</span><span class="string">"@var takes 2 parameters"</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">bibv</span><span class="plain">);</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">program</span><span class="plain">, </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;pars</span><span class="plain">[0], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="functiontext">Readme::expand_material</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">bibv</span><span class="plain">, </span><span class="identifier">ws</span><span class="plain">-</span><span class="element">&gt;stack_frame</span><span class="plain">-</span><span class="element">&gt;pars</span><span class="plain">[1], </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="functiontext">Readme::write_var</span><span class="plain">(</span><span class="identifier">ws</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">program</span><span class="plain">, </span><span class="identifier">bibv</span><span class="plain">, </span><span class="identifier">tfp</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">bibv</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>An "asset" here is something for which we might want to write the version
number of, or some similar metadata for. Assets are usually webs, but can
also be a few other rather Inform-specific things; those have a more limited
range of bibliographic data, just the version and date (and we will not
assume that the version complies with any format).
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">writeme_asset</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">name</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">web</span><span class="plain"> *</span><span class="identifier">if_web</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">date</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">version</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">next_is_version</span><span class="plain">;</span>
<span class="constant">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">writeme_asset</span><span class="plain">;</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::write_var</span><span class="plain">(</span><span class="reserved">write_state</span><span class="plain"> *</span><span class="identifier">ws</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OUT</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">program</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">datum</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">writeme_asset</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = </span><span class="functiontext">Readme::find_asset</span><span class="plain">(</span><span class="identifier">program</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="element">&gt;if_web</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="functiontext">Bibliographic::get_datum</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;if_web</span><span class="plain">, </span><span class="identifier">datum</span><span class="plain">));</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">datum</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Build Date"</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">A</span><span class="plain">-</span><span class="element">&gt;date</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq</span><span class="plain">(</span><span class="identifier">datum</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"Version Number"</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">A</span><span class="plain">-</span><span class="element">&gt;version</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::write_var is used in <a href="#SP7_1">&#167;7.1</a>, <a href="#SP7_2">&#167;7.2</a>, <a href="#SP7_3">&#167;7.3</a>.</p>
<p class="endnote">The structure writeme_asset is private to this section.</p>
<p class="inwebparagraph"><a id="SP9"></a><b>&#167;9. </b>That just leaves the business of inspecting assets to obtain their metadata.
</p>
<pre class="display">
<span class="reserved">writeme_asset</span><span class="plain"> *</span><span class="functiontext">Readme::find_asset</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">program</span><span class="plain">) {</span>
<span class="reserved">writeme_asset</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">A</span><span class="plain">, </span><span class="reserved">writeme_asset</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">program</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain">)) </span><span class="reserved">return</span><span class="plain"> </span><span class="identifier">A</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">writeme_asset</span><span class="plain">);</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;name</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">);</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;if_web</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;date</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;version</span><span class="plain"> = </span><span class="functiontext">Str::new</span><span class="plain">();</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;next_is_version</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
&lt;<span class="cwebmacro">Read in the asset</span> <span class="cwebmacronumber">9.1</span>&gt;<span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">A</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::find_asset is used in <a href="#SP8">&#167;8</a>.</p>
<p class="inwebparagraph"><a id="SP9_1"></a><b>&#167;9.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read in the asset</span> <span class="cwebmacronumber">9.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::ends_with_wide_string</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">, </span><span class="identifier">L</span><span class="string">".i7x"</span><span class="plain">)) {</span>
&lt;<span class="cwebmacro">Read in the extension file</span> <span class="cwebmacronumber">9.1.1</span>&gt;<span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</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="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"Contents.w"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">)) {</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;if_web</span><span class="plain"> = </span><span class="functiontext">Reader::load_web</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">), </span><span class="identifier">NULL</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">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="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">I6_vn</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span>
<span class="functiontext">Pathnames::subfolder</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"inform6"</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"header.h"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">I6_vn</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Read in I6 source header file</span> <span class="cwebmacronumber">9.1.2</span>&gt;<span class="plain">;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">template_vn</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"(manifest).txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">template_vn</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Read in template manifest file</span> <span class="cwebmacronumber">9.1.3</span>&gt;<span class="plain">;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">rmt_vn</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"README.txt"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">rmt_vn</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Read in README file</span> <span class="cwebmacronumber">9.1.4</span>&gt;<span class="plain">;</span>
<span class="identifier">rmt_vn</span><span class="plain"> = </span><span class="functiontext">Filenames::in_folder</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">), </span><span class="identifier">I</span><span class="string">"README.md"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">TextFiles::exists</span><span class="plain">(</span><span class="identifier">rmt_vn</span><span class="plain">)) </span>&lt;<span class="cwebmacro">Read in README file</span> <span class="cwebmacronumber">9.1.4</span>&gt;<span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9">&#167;9</a>.</p>
<p class="inwebparagraph"><a id="SP9_1_1"></a><b>&#167;9.1.1. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read in the extension file</span> <span class="cwebmacronumber">9.1.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">program</span><span class="plain">), </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read extension"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
<span class="plain">&amp;</span><span class="functiontext">Readme::extension_harvester</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_1">&#167;9.1</a>.</p>
<p class="inwebparagraph"><a id="SP9_1_2"></a><b>&#167;9.1.2. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read in I6 source header file</span> <span class="cwebmacronumber">9.1.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">I6_vn</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read header file from I6 source"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
<span class="plain">&amp;</span><span class="functiontext">Readme::header_harvester</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_1">&#167;9.1</a>.</p>
<p class="inwebparagraph"><a id="SP9_1_3"></a><b>&#167;9.1.3. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read in template manifest file</span> <span class="cwebmacronumber">9.1.3</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">template_vn</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read manifest file from website template"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
<span class="plain">&amp;</span><span class="functiontext">Readme::template_harvester</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_1">&#167;9.1</a>.</p>
<p class="inwebparagraph"><a id="SP9_1_4"></a><b>&#167;9.1.4. </b><code class="display">
&lt;<span class="cwebmacrodefn">Read in README file</span> <span class="cwebmacronumber">9.1.4</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">rmt_vn</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"unable to read README file from website template"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">,</span>
<span class="plain">&amp;</span><span class="functiontext">Readme::readme_harvester</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">A</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP9_1">&#167;9.1</a> (twice).</p>
<p class="inwebparagraph"><a id="SP10"></a><b>&#167;10. </b>The format for the contents section of a web is documented in Inweb.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::extension_harvester</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">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">state</span><span class="plain">) {</span>
<span class="reserved">writeme_asset</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">writeme_asset</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *Version (%c*?) of %c*begins here. *"</span><span class="plain">))</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;version</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::extension_harvester is used in <a href="#SP9_1_1">&#167;9.1.1</a>.</p>
<p class="inwebparagraph"><a id="SP11"></a><b>&#167;11. </b>Explicit code to read from <code class="display"><span class="extract">header.h</span></code> in the Inform 6 repository.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::header_harvester</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">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">state</span><span class="plain">) {</span>
<span class="reserved">writeme_asset</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">writeme_asset</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"#define RELEASE_NUMBER (%c*?) *"</span><span class="plain">))</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;version</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"#define RELEASE_DATE \</span><span class="plain">"</span><span class="string">(%c*?)\</span><span class="plain">"</span><span class="string"> *"</span><span class="plain">))</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;date</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::header_harvester is used in <a href="#SP9_1_2">&#167;9.1.2</a>.</p>
<p class="inwebparagraph"><a id="SP12"></a><b>&#167;12. </b>Explicit code to read from the manifest file of a website template.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::template_harvester</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">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">state</span><span class="plain">) {</span>
<span class="reserved">writeme_asset</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">writeme_asset</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"%[INTERPRETERVERSION%]"</span><span class="plain">)) {</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;next_is_version</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;next_is_version</span><span class="plain">) {</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;version</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">);</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;next_is_version</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::template_harvester is used in <a href="#SP9_1_3">&#167;9.1.3</a>.</p>
<p class="inwebparagraph"><a id="SP13"></a><b>&#167;13. </b>And this is needed for <code class="display"><span class="extract">cheapglk</span></code> and <code class="display"><span class="extract">glulxe</span></code> in the Inform repository.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Readme::readme_harvester</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">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">state</span><span class="plain">) {</span>
<span class="reserved">writeme_asset</span><span class="plain"> *</span><span class="identifier">A</span><span class="plain"> = (</span><span class="reserved">writeme_asset</span><span class="plain"> *) </span><span class="identifier">state</span><span class="plain">;</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">text</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> ((</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"CheapGlk Library: version (%c*?) *"</span><span class="plain">)) ||</span>
<span class="plain">(</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">text</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"- Version (%c*?) *"</span><span class="plain">)))</span>
<span class="identifier">A</span><span class="plain">-</span><span class="element">&gt;version</span><span class="plain"> = </span><span class="functiontext">Str::duplicate</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Readme::readme_harvester is used in <a href="#SP9_1_4">&#167;9.1.4</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="6-bf2.html">Back to 'Build Files'</a></li><li><i>(This section ends Chapter 6: Extras.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>

View file

@ -209,6 +209,10 @@
<p><a href="6-bf2.html"><spon class="sectiontitle">Build Files</span></a> -
<span class="purpose">Manages the build metadata for an inweb project.</span></p>
</li>
<li>
<p><a href="6-rw.html"><spon class="sectiontitle">Readme Writeme</span></a> -
<span class="purpose">To construct Readme and similar files.</span></p>
</li>
</ul>
</li>
</ul>

View file

@ -77,19 +77,20 @@ test:
.PHONY: commit
commit:
$(INWEB) -advance-build-file $(ME)/build.txt
$(INWEB) -prototype inweb/scripts/READMEscript.txt -write-me inweb/README.md
cd $(ME); git commit -a
.PHONY: pages
pages:
mkdir -p $(ME)/docs
rm $(ME)/docs/*.html
inform/inpolicy/Tangled/inpolicy -write-me inweb/scripts/READMEscript.txt
rm -f $(ME)/docs/*.html
$(INWEB) -prototype inweb/scripts/READMEscript.txt -write-me inweb/README.md
mkdir -p $(ME)/docs/inweb
rm $(ME)/docs/inweb/*.html
rm -f $(ME)/docs/inweb/*.html
mkdir -p $(ME)/docs/foundation-module
rm $(ME)/docs/foundation-module/*.html
rm -f $(ME)/docs/foundation-module/*.html
mkdir -p $(ME)/docs/foundation-test
rm $(ME)/docs/foundation-test/*.html
rm -f $(ME)/docs/foundation-test/*.html
$(INWEB) $(ME)/docs/docs-src/webs.inweb -weave-as GitHubCovers -weave-into $(ME)/docs -navigation $(ME)/docs/docs-src/nav-o.html
$(INWEB) $(ME) -weave-docs -weave-into $(ME)/docs/inweb -breadcrumb 'Source:../webs.html' -navigation $(ME)/docs/docs-src/nav.html
$(INWEB) $(ME)/foundation-module -weave-docs -weave-into $(ME)/docs/foundation-module -breadcrumb 'Source:../webs.html' -navigation $(ME)/docs/docs-src/nav.html

View file

@ -1,5 +1,6 @@
@-> ../README.md
# Inweb @version(inweb)
# Inweb @var(inweb,Version Number)
v@var(inweb,Semantic Version Number) '@var(inweb,Version Name)' (@var(inweb,Build Date))
## About Inweb
@ -83,6 +84,5 @@ If you have also built Intest as "work/intest", then you can try these:
### Colophon
This README.mk file was generated automatically by Inpolicy (see the
[Inform repository](https://github.com/ganelson/inform)), and should not
This README.mk file was generated automatically by Inweb, and should not
be edited. To make changes, edit scripts/READMEscript.txt and re-generate.

View file

@ -1,6 +1,9 @@
# This is a makefile for "inweb". It expects the current working folder to be
# the one above the one holding this file (unusually), so it's best called
# with e.g. "make -f inweb/make-inweb.mk".
# with e.g. "make -f inweb/inweb.mk".
#
# To generate inweb.mk from its source, use e.g.:
# inweb/Tangled/inweb inweb -prototype inweb/scripts/makescript.txt -makefile inweb/inweb.mk
ME = inweb
SAFETYCOPY = $(ME)/Tangled/inweb_dev
@ -98,6 +101,7 @@ test:
.PHONY: commit
commit:
$(INWEB) -advance-build-file $(ME)/build.txt
$(INWEB) -prototype inweb/scripts/READMEscript.txt -write-me inweb/README.md
cd $(ME); git commit -a
# Weaving the web for GitHub Pages:
@ -105,14 +109,14 @@ commit:
.PHONY: pages
pages:
mkdir -p $(ME)/docs
rm $(ME)/docs/*.html
inform/inpolicy/Tangled/inpolicy -write-me inweb/scripts/READMEscript.txt
rm -f $(ME)/docs/*.html
$(INWEB) -prototype inweb/scripts/READMEscript.txt -write-me inweb/README.md
mkdir -p $(ME)/docs/inweb
rm $(ME)/docs/inweb/*.html
rm -f $(ME)/docs/inweb/*.html
mkdir -p $(ME)/docs/foundation-module
rm $(ME)/docs/foundation-module/*.html
rm -f $(ME)/docs/foundation-module/*.html
mkdir -p $(ME)/docs/foundation-test
rm $(ME)/docs/foundation-test/*.html
rm -f $(ME)/docs/foundation-test/*.html
$(INWEB) $(ME)/docs/docs-src/webs.inweb -weave-as GitHubCovers -weave-into $(ME)/docs -navigation $(ME)/docs/docs-src/nav-o.html
$(INWEB) $(ME) -weave-docs -weave-into $(ME)/docs/inweb -breadcrumb 'Source:../webs.html' -navigation $(ME)/docs/docs-src/nav.html
$(INWEB) $(ME)/foundation-module -weave-docs -weave-into $(ME)/docs/foundation-module -breadcrumb 'Source:../webs.html' -navigation $(ME)/docs/docs-src/nav.html