2019-02-04 22:26:45 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
< html >
< head >
2020-04-08 22:41:00 +00:00
< title > Web Modules< / title >
2020-03-19 00:03:04 +00:00
< meta name = "viewport" content = "width=device-width initial-scale=1" >
2019-02-04 22:26:45 +00:00
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" >
< meta http-equiv = "Content-Language" content = "en-gb" >
2020-03-19 00:03:04 +00:00
< link href = "../inweb.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2019-02-04 22:26:45 +00:00
< / head >
< body >
2020-03-19 00:03:04 +00:00
< 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" >
2020-04-08 22:41:00 +00:00
<!-- Weave of 'Web Modules' generated by 7 -->
2020-04-01 19:43:48 +00:00
< ul class = "crumbs" > < li > < a href = "../webs.html" > Source< / a > < / li > < li > < a href = "index.html" > foundation< / a > < / li > < li > < a href = "index.html#8" > Chapter 8: Literate Programming< / a > < / li > < li > < b > Web Modules< / b > < / li > < / ul > < p class = "purpose" > To search for included modules, and track dependencies between them.< / p >
2019-02-04 22:26:45 +00:00
2020-04-09 17:32:37 +00:00
< ul class = "toc" > < li > < a href = "#SP1" > § 1. Creation< / a > < / li > < li > < a href = "#SP4" > § 4. Dependencies< / a > < / li > < li > < a href = "#SP5" > § 5. Searching< / a > < / li > < li > < a href = "#SP9" > § 9. Resolving cross-reference names< / a > < / li > < / ul > < hr class = "tocbar" >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP1" > < / a > < b > § 1. Creation. < / b > Each web of source material discovered by Inweb is given one of the following.
Ordinarily these are found only when reading in a web for weaving, tangling
and so on: in the vast majority of Inweb runs, all modules will have the
"module origin marker" < code class = "display" > < span class = "extract" > READING_WEB_MOM< / span > < / code > . But when Inweb is constructing a
makefile for a suite of tools, it can also discover multiple webs by other
means.
< / p >
< pre class = "definitions" >
2020-04-06 11:26:10 +00:00
< span class = "definitionkeyword" > enum< / span > < span class = "constant" > READING_WEB_MOM< / span > < span class = "definitionkeyword" > from < / span > < span class = "constant" > 0< / span >
< span class = "definitionkeyword" > enum< / span > < span class = "constant" > MAKEFILE_TOOL_MOM< / span >
< span class = "definitionkeyword" > enum< / span > < span class = "constant" > MAKEFILE_WEB_MOM< / span >
< span class = "definitionkeyword" > enum< / span > < span class = "constant" > MAKEFILE_MODULE_MOM< / span >
2019-02-04 22:26:45 +00:00
< / pre >
< pre class = "display" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > typedef< / span > < span class = "plain" > < / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > module< / span > < span class = "plain" > {< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > pathname< / span > < span class = "plain" > *< / span > < span class = "identifier" > module_location< / 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" > module_name< / span > < span class = "plain" > ;< / span >
2020-04-08 12:03:15 +00:00
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > linked_list< / span > < span class = "plain" > *< / span > < span class = "identifier" > dependencies< / span > < span class = "plain" > ; < / span > < span class = "comment" > of < code class = "display" > < span class = "extract" > module< / span > < / code > : which other modules does this need?< / span >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > module_tag< / span > < span class = "plain" > ;< / span >
2020-04-08 12:03:15 +00:00
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > origin_marker< / span > < span class = "plain" > ; < / span > < span class = "comment" > one of the < code class = "display" > < span class = "extract" > *_MOM< / span > < / code > values above< / span >
2020-04-09 17:32:37 +00:00
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > linked_list< / span > < span class = "plain" > *< / span > < span class = "identifier" > chapters_md< / span > < span class = "plain" > ; < / span > < span class = "comment" > of < code class = "display" > < span class = "extract" > chapter_md< / span > < / code > : just the ones in this module< / span >
2020-04-08 12:03:15 +00:00
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > linked_list< / span > < span class = "plain" > *< / span > < span class = "identifier" > sections_md< / span > < span class = "plain" > ; < / span > < span class = "comment" > of < code class = "display" > < span class = "extract" > section_md< / span > < / code > : just the ones in this module< / span >
2020-04-06 11:26:10 +00:00
< span class = "constant" > MEMORY_MANAGEMENT< / span >
< span class = "plain" > } < / span > < span class = "reserved" > module< / span > < span class = "plain" > ;< / span >
2019-02-04 22:26:45 +00:00
< / pre >
< p class = "inwebparagraph" > < / p >
2020-04-02 12:30:38 +00:00
< p class = "endnote" > The structure module is accessed in 8/ws and here.< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP2" > < / a > < b > § 2. < / b > < / p >
< pre class = "display" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "functiontext" > WebModules::new< / span > < span class = "plain" > (< / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > name< / span > < span class = "plain" > , < / span > < span class = "reserved" > pathname< / span > < span class = "plain" > *< / span > < span class = "identifier" > at< / span > < span class = "plain" > , < / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > m< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "identifier" > M< / span > < span class = "plain" > = < / span > < span class = "identifier" > CREATE< / span > < span class = "plain" > (< / span > < span class = "reserved" > module< / span > < span class = "plain" > );< / span >
< span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > module_location< / span > < span class = "plain" > = < / span > < span class = "identifier" > at< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > module_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" > dependencies< / span > < span class = "plain" > = < / span > < span class = "identifier" > NEW_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "reserved" > module< / span > < span class = "plain" > );< / span >
< span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > origin_marker< / span > < span class = "plain" > = < / span > < span class = "identifier" > m< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > module_tag< / span > < span class = "plain" > = < / span > < span class = "identifier" > I< / span > < span class = "string" > "miscellaneous"< / span > < span class = "plain" > ;< / span >
2020-04-09 17:32:37 +00:00
< span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > chapters_md< / span > < span class = "plain" > = < / span > < span class = "identifier" > NEW_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "reserved" > chapter_md< / span > < span class = "plain" > );< / span >
2020-04-06 11:26:10 +00:00
< span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > sections_md< / span > < span class = "plain" > = < / span > < span class = "identifier" > NEW_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "reserved" > section_md< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > M< / span > < span class = "plain" > ;< / span >
2019-02-04 22:26:45 +00:00
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
2020-04-01 19:43:48 +00:00
< p class = "endnote" > The function WebModules::new is used in < a href = "#SP3" > § 3< / a > , < a href = "#SP7_1" > § 7.1< / a > .< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP3" > < / a > < b > § 3. < / b > In the Inweb documentation, "module" is used to refer to a sidekick web which
contains a suite of utility routines, or a major component of a program, but
which is not a program in its own right.
< / p >
< p class = "inwebparagraph" > Internally, though, every web produces a < code class = "display" > < span class = "extract" > module< / span > < / code > structure. The one for the
main web — which can be tangled, and results in an actual program — is
internally named < code class = "display" > < span class = "extract" > "(main)"< / span > < / code > , a name which the user will never see.
< / p >
< pre class = "display" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "functiontext" > WebModules::create_main_module< / span > < span class = "plain" > (< / span > < span class = "reserved" > web_md< / span > < span class = "plain" > *< / span > < span class = "identifier" > WS< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "functiontext" > WebModules::new< / span > < span class = "plain" > (< / span > < span class = "identifier" > I< / span > < span class = "string" > "(main)"< / span > < span class = "plain" > , < / span > < span class = "identifier" > WS< / span > < span class = "plain" > -> < / span > < span class = "element" > path_to_web< / span > < span class = "plain" > , < / span > < span class = "constant" > READING_WEB_MOM< / span > < span class = "plain" > );< / span >
2019-02-04 22:26:45 +00:00
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
2020-04-02 12:30:38 +00:00
< p class = "endnote" > The function WebModules::create_main_module is used in 8/ws (< a href = "8-ws.html#SP5_2" > § 5.2< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP4" > < / a > < b > § 4. Dependencies. < / b > When web A imports module B, we will say that A is dependent on B. A web
can import multiple modules, so there can a list of dependencies. These are
needed when constructing makefiles, since the source code in B affects the
program generated by A.
< / p >
< pre class = "display" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > WebModules::dependency< / span > < span class = "plain" > (< / span > < span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "identifier" > A< / span > < span class = "plain" > , < / span > < span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "identifier" > B< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > ((< / span > < span class = "identifier" > A< / span > < span class = "plain" > == < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ) || (< / span > < span class = "identifier" > B< / span > < span class = "plain" > == < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > )) < / span > < span class = "identifier" > internal_error< / span > < span class = "plain" > (< / span > < span class = "string" > "no module"< / span > < span class = "plain" > );< / span >
< span class = "identifier" > ADD_TO_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > B< / span > < span class = "plain" > , < / span > < span class = "reserved" > module< / span > < span class = "plain" > , < / span > < span class = "identifier" > A< / span > < span class = "plain" > -> < / span > < span class = "identifier" > dependencies< / span > < span class = "plain" > );< / span >
2019-02-04 22:26:45 +00:00
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
2020-04-01 19:43:48 +00:00
< p class = "endnote" > The function WebModules::dependency is used in < a href = "#SP7_1" > § 7.1< / a > .< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP5" > < / a > < b > § 5. Searching. < / b > The following abstracts the idea of a place where modules might be found.
(At one time there was going to be a more elaborate search hierarchy.)
< / p >
< pre class = "display" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > typedef< / span > < span class = "plain" > < / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > module_search< / span > < span class = "plain" > {< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > pathname< / span > < span class = "plain" > *< / span > < span class = "identifier" > path_to_search< / span > < span class = "plain" > ;< / span >
< span class = "constant" > MEMORY_MANAGEMENT< / span >
< span class = "plain" > } < / span > < span class = "reserved" > module_search< / span > < span class = "plain" > ;< / span >
2019-02-04 22:26:45 +00:00
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > The structure module_search is private to this section.< / p >
< p class = "inwebparagraph" > < a id = "SP6" > < / a > < b > § 6. < / b > < / p >
< pre class = "display" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > module_search< / span > < span class = "plain" > *< / span > < span class = "functiontext" > WebModules::make_search_path< / span > < span class = "plain" > (< / span > < span class = "reserved" > pathname< / span > < span class = "plain" > *< / span > < span class = "identifier" > ext_path< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > module_search< / span > < span class = "plain" > *< / span > < span class = "identifier" > ms< / span > < span class = "plain" > = < / span > < span class = "identifier" > CREATE< / span > < span class = "plain" > (< / span > < span class = "reserved" > module_search< / span > < span class = "plain" > );< / span >
< span class = "identifier" > ms< / span > < span class = "plain" > -> < / span > < span class = "element" > path_to_search< / span > < span class = "plain" > = < / span > < span class = "identifier" > ext_path< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > ms< / span > < span class = "plain" > ;< / span >
2019-02-04 22:26:45 +00:00
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
2020-04-02 17:38:08 +00:00
< p class = "endnote" > The function WebModules::make_search_path is used in 8/ws (< a href = "8-ws.html#SP5" > § 5< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP7" > < / a > < b > § 7. < / b > When a web's contents page says to < code class = "display" > < span class = "extract" > import Blah< / span > < / code > , how do we find the module
called < code class = "display" > < span class = "extract" > Blah< / span > < / code > on disc? We try four possibilities in sequence:
< / p >
< pre class = "display" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "functiontext" > WebModules::find< / span > < span class = "plain" > (< / span > < span class = "reserved" > web_md< / span > < span class = "plain" > *< / span > < span class = "identifier" > WS< / span > < span class = "plain" > , < / span > < span class = "reserved" > module_search< / span > < span class = "plain" > *< / span > < span class = "identifier" > ms< / span > < span class = "plain" > , < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > name< / span > < span class = "plain" > , < / span > < span class = "reserved" > pathname< / span > < span class = "plain" > *< / span > < span class = "identifier" > X< / span > < span class = "plain" > ) {< / span >
2020-04-01 19:43:48 +00:00
< span class = "identifier" > TEMPORARY_TEXT< / span > < span class = "plain" > (< / span > < span class = "identifier" > T< / span > < span class = "plain" > );< / span >
< span class = "identifier" > WRITE_TO< / span > < span class = "plain" > (< / span > < span class = "identifier" > T< / span > < span class = "plain" > , < / span > < span class = "string" > "%S-module"< / span > < span class = "plain" > , < / span > < span class = "identifier" > name< / span > < span class = "plain" > );< / span >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > pathname< / span > < span class = "plain" > *< / span > < span class = "identifier" > tries< / span > < span class = "plain" > [4];< / span >
< span class = "identifier" > tries< / span > < span class = "plain" > [0] = < / span > < span class = "identifier" > WS< / span > < span class = "plain" > ?(< / span > < span class = "identifier" > WS< / span > < span class = "plain" > -> < / span > < span class = "element" > path_to_web< / span > < span class = "plain" > ):< / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > tries< / span > < span class = "plain" > [1] = < / span > < span class = "identifier" > tries< / span > < span class = "plain" > [0]?(< / span > < span class = "functiontext" > Pathnames::up< / span > < span class = "plain" > (< / span > < span class = "identifier" > tries< / span > < span class = "plain" > [0])):< / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ;< / span >
2020-04-01 19:43:48 +00:00
< span class = "identifier" > tries< / span > < span class = "plain" > [2] = < / span > < span class = "identifier" > X< / span > < span class = "plain" > ;< / span >
2020-04-06 11:26:10 +00:00
< span class = "identifier" > tries< / span > < span class = "plain" > [3] = < / span > < span class = "identifier" > ms< / span > < span class = "plain" > -> < / span > < span class = "element" > path_to_search< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > N< / span > < span class = "plain" > = < / span > < span class = "constant" > 4< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > i< / span > < span class = "plain" > =0; < / span > < span class = "identifier" > i< / span > < span class = "plain" > < < / span > < span class = "identifier" > N< / span > < span class = "plain" > ; < / span > < span class = "identifier" > i< / 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 = "functiontext" > Pathnames::from_text_relative< / span > < span class = "plain" > (< / span > < span class = "identifier" > tries< / span > < span class = "plain" > [< / span > < span class = "identifier" > i< / span > < span class = "plain" > ], < / span > < span class = "identifier" > T< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > ((< / span > < span class = "identifier" > P< / span > < span class = "plain" > ) & & (< / span > < span class = "functiontext" > WebModules::exists< / span > < span class = "plain" > (< / span > < span class = "identifier" > P< / span > < span class = "plain" > ))) < / span > < < span class = "cwebmacro" > Accept this directory as the module< / span > < span class = "cwebmacronumber" > 7.1< / span > > < span class = "plain" > ;< / span >
2019-02-04 22:26:45 +00:00
< span class = "plain" > }< / span >
2020-04-01 19:43:48 +00:00
< span class = "identifier" > DISCARD_TEXT< / span > < span class = "plain" > (< / span > < span class = "identifier" > T< / span > < span class = "plain" > );< / span >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ;< / span >
2019-02-04 22:26:45 +00:00
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
2020-04-02 12:30:38 +00:00
< p class = "endnote" > The function WebModules::find is used in 8/ws (< a href = "8-ws.html#SP7_3_3_2" > § 7.3.3.2< / a > ).< / p >
2019-02-04 22:26:45 +00:00
< p class = "inwebparagraph" > < a id = "SP7_1" > < / a > < b > § 7.1. < / b > When the module is found (if it is), a suitable module structure is made,
and a dependency created from the web's < code class = "display" > < span class = "extract" > (main)< / span > < / code > module to this one.
< / p >
< p class = "macrodefinition" > < code class = "display" >
< < span class = "cwebmacrodefn" > Accept this directory as the module< / span > < span class = "cwebmacronumber" > 7.1< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "identifier" > M< / span > < span class = "plain" > = < / span > < span class = "functiontext" > WebModules::new< / span > < span class = "plain" > (< / span > < span class = "identifier" > name< / span > < span class = "plain" > , < / span > < span class = "identifier" > P< / span > < span class = "plain" > , < / span > < span class = "constant" > READING_WEB_MOM< / span > < span class = "plain" > );< / span >
< span class = "functiontext" > WebModules::dependency< / span > < span class = "plain" > (< / span > < span class = "identifier" > WS< / span > < span class = "plain" > -> < / span > < span class = "element" > as_module< / span > < span class = "plain" > , < / span > < span class = "identifier" > M< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > M< / span > < span class = "plain" > ;< / span >
2019-02-04 22:26:45 +00:00
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP7" > § 7< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP8" > < / a > < b > § 8. < / b > We accept that a plausibly-named directory is indeed the module being
2020-04-02 12:30:38 +00:00
sought if it looks like a web.
2019-02-04 22:26:45 +00:00
< / p >
< pre class = "display" >
2020-04-06 11:26:10 +00:00
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "functiontext" > WebModules::exists< / span > < span class = "plain" > (< / span > < span class = "reserved" > pathname< / span > < span class = "plain" > *< / span > < span class = "identifier" > P< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "functiontext" > WebMetadata::directory_looks_like_a_web< / span > < span class = "plain" > (< / span > < span class = "identifier" > P< / span > < span class = "plain" > );< / span >
2019-02-04 22:26:45 +00:00
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
2020-04-01 19:43:48 +00:00
< p class = "endnote" > The function WebModules::exists is used in < a href = "#SP7" > § 7< / a > .< / p >
2019-02-04 22:26:45 +00:00
2020-04-09 17:32:37 +00:00
< p class = "inwebparagraph" > < a id = "SP9" > < / a > < b > § 9. Resolving cross-reference names. < / b > Suppose we are in module < code class = "display" > < span class = "extract" > from_M< / span > < / code > and want to understand which section of
a relevant web < code class = "display" > < span class = "extract" > text< / span > < / code > might refer to. It could be the name of a module,
either this one or one dependent on it; or the name of a chapter in one
of those, or the shortened forms of those; or the name of a section. It
may match multiple possibilities: we return how many, and if this is
positive, we write the module in which the first find was made in < code class = "display" > < span class = "extract" > *return M< / span > < / code > ,
the section in < code class = "display" > < span class = "extract" > *return_Sm< / span > < / code > , and set the flag < code class = "display" > < span class = "extract" > *named_as_module< / span > < / code > according
to whether the reference was a bare module name (say, "foundation") or not.
< / p >
< p class = "inwebparagraph" > Note that we consider first the possibilities within < code class = "display" > < span class = "extract" > from_M< / span > < / code > : we only
look at other modules if there are none. Thus, an unambiguous result in
< code class = "display" > < span class = "extract" > from_M< / span > < / code > is good enough, even if there are other possibilities elsewhere.
< / p >
< p class = "inwebparagraph" > A reference in the form < code class = "display" > < span class = "extract" > module: reference< / span > < / code > is taken to be in the module
of that name: for example, < code class = "display" > < span class = "extract" > "foundation: Web Modules"< / span > < / code > would find the
section of code you are now reading.
< / p >
< pre class = "display" >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "functiontext" > WebModules::named_reference< / span > < span class = "plain" > (< / span > < span class = "reserved" > module< / span > < span class = "plain" > **< / span > < span class = "identifier" > return_M< / span > < span class = "plain" > , < / span > < span class = "reserved" > section_md< / span > < span class = "plain" > **< / span > < span class = "identifier" > return_Sm< / span > < span class = "plain" > ,< / span >
< span class = "reserved" > int< / span > < span class = "plain" > *< / span > < span class = "identifier" > named_as_module< / span > < span class = "plain" > , < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > title< / span > < span class = "plain" > , < / span > < span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "identifier" > from_M< / span > < span class = "plain" > , < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > text< / span > < span class = "plain" > , < / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > list< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > *< / span > < span class = "identifier" > return_M< / span > < span class = "plain" > = < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ; *< / span > < span class = "identifier" > return_Sm< / span > < span class = "plain" > = < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ; *< / span > < span class = "identifier" > named_as_module< / span > < span class = "plain" > = < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > module< / span > < span class = "plain" > *< / span > < span class = "identifier" > M< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > finds< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > from_M< / span > < span class = "plain" > == < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ) < / span > < span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > 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" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > seek< / span > < span class = "plain" > = < / span > < span class = "identifier" > text< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > Regexp::match< / span > < span class = "plain" > (& < / span > < span class = "identifier" > mr< / span > < span class = "plain" > , < / span > < span class = "identifier" > text< / span > < span class = "plain" > , < / span > < span class = "identifier" > L< / span > < span class = "string" > "(%C+?): *(%c+?) *"< / 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" > module< / span > < span class = "plain" > , < / span > < span class = "identifier" > from_M< / span > < span class = "plain" > -> < / span > < span class = "element" > dependencies< / span > < span class = "plain" > )< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > Str::eq_insensitive< / span > < span class = "plain" > (< / span > < span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > module_name< / span > < span class = "plain" > , < / span > < span class = "identifier" > mr< / span > < span class = "plain" > .< / span > < span class = "element" > exp< / span > < span class = "plain" > [0])) {< / span >
< span class = "identifier" > seek< / span > < span class = "plain" > = < / span > < span class = "identifier" > mr< / span > < span class = "plain" > .< / span > < span class = "identifier" > exp< / span > < span class = "plain" > [1];< / span >
< < span class = "cwebmacro" > Look for references to chapters or sections in M< / span > < span class = "cwebmacronumber" > 9.1< / span > > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
< span class = "functiontext" > Regexp::dispose_of< / span > < span class = "plain" > (& < / span > < span class = "identifier" > mr< / span > < span class = "plain" > );< / span >
< span class = "identifier" > seek< / span > < span class = "plain" > = < / span > < span class = "identifier" > text< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > stage< / span > < span class = "plain" > = < / span > < span class = "constant" > 1< / span > < span class = "plain" > ; ((< / span > < span class = "identifier" > finds< / span > < span class = "plain" > == < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) & & (< / span > < span class = "identifier" > stage< / span > < span class = "plain" > < = < / span > < span class = "constant" > 2< / span > < span class = "plain" > )); < / span > < span class = "identifier" > stage< / span > < span class = "plain" > ++) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > stage< / span > < span class = "plain" > == < / span > < span class = "constant" > 1< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > M< / span > < span class = "plain" > = < / span > < span class = "identifier" > from_M< / span > < span class = "plain" > ;< / span >
< < span class = "cwebmacro" > Look for references to chapters or sections in M< / span > < span class = "cwebmacronumber" > 9.1< / span > > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > stage< / span > < span class = "plain" > == < / span > < span class = "constant" > 2< / 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" > module< / span > < span class = "plain" > , < / span > < span class = "identifier" > from_M< / span > < span class = "plain" > -> < / span > < span class = "element" > dependencies< / span > < span class = "plain" > )< / span >
< < span class = "cwebmacro" > Look for references to chapters or sections in M< / span > < span class = "cwebmacronumber" > 9.1< / span > > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > finds< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > The function WebModules::named_reference appears nowhere else.< / p >
< p class = "inwebparagraph" > < a id = "SP9_1" > < / a > < b > § 9.1. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Look for references to chapters or sections in M< / span > < span class = "cwebmacronumber" > 9.1< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > M< / span > < span class = "plain" > == < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ) < / span > < span class = "identifier" > internal_error< / span > < span class = "plain" > (< / span > < span class = "string" > "no module"< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > Str::eq_insensitive< / span > < span class = "plain" > (< / span > < span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > module_name< / span > < span class = "plain" > , < / span > < span class = "identifier" > seek< / span > < span class = "plain" > ))< / span >
< < span class = "cwebmacro" > Found first section in module< / span > < span class = "cwebmacronumber" > 9.1.1< / span > > < span class = "plain" > ;< / span >
< span class = "reserved" > chapter_md< / span > < span class = "plain" > *< / span > < span class = "identifier" > Cm< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > section_md< / span > < span class = "plain" > *< / span > < span class = "identifier" > Sm< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > LOOP_OVER_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > Cm< / span > < span class = "plain" > , < / span > < span class = "reserved" > chapter_md< / span > < span class = "plain" > , < / span > < span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > chapters_md< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > if< / span > < span class = "plain" > ((< / span > < span class = "functiontext" > Str::eq_insensitive< / span > < span class = "plain" > (< / span > < span class = "identifier" > Cm< / span > < span class = "plain" > -> < / span > < span class = "element" > ch_title< / span > < span class = "plain" > , < / span > < span class = "identifier" > seek< / span > < span class = "plain" > )) ||< / span >
< span class = "plain" > (< / span > < span class = "functiontext" > Str::eq_insensitive< / span > < span class = "plain" > (< / span > < span class = "identifier" > Cm< / span > < span class = "plain" > -> < / span > < span class = "element" > ch_basic_title< / span > < span class = "plain" > , < / span > < span class = "identifier" > seek< / span > < span class = "plain" > )) ||< / span >
< span class = "plain" > (< / span > < span class = "functiontext" > Str::eq_insensitive< / span > < span class = "plain" > (< / span > < span class = "identifier" > Cm< / span > < span class = "plain" > -> < / span > < span class = "element" > ch_decorated_title< / span > < span class = "plain" > , < / span > < span class = "identifier" > seek< / span > < span class = "plain" > )))< / span >
< < span class = "cwebmacro" > Found first section in chapter< / span > < span class = "cwebmacronumber" > 9.1.2< / span > > < span class = "plain" > ;< / span >
< span class = "identifier" > LOOP_OVER_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > Sm< / span > < span class = "plain" > , < / span > < span class = "reserved" > section_md< / span > < span class = "plain" > , < / span > < span class = "identifier" > Cm< / span > < span class = "plain" > -> < / span > < span class = "element" > sections_md< / span > < span class = "plain" > )< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > Str::eq_insensitive< / span > < span class = "plain" > (< / span > < span class = "identifier" > Sm< / span > < span class = "plain" > -> < / span > < span class = "element" > sect_title< / span > < span class = "plain" > , < / span > < span class = "identifier" > seek< / span > < span class = "plain" > ))< / span >
< < span class = "cwebmacro" > Found section by name< / span > < span class = "cwebmacronumber" > 9.1.3< / 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" > § 9< / a > (three times).< / p >
< p class = "inwebparagraph" > < a id = "SP9_1_1" > < / a > < b > § 9.1.1. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Found first section in module< / span > < span class = "cwebmacronumber" > 9.1.1< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
< span class = "identifier" > finds< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > finds< / span > < span class = "plain" > == < / span > < span class = "constant" > 1< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > *< / span > < span class = "identifier" > return_M< / span > < span class = "plain" > = < / span > < span class = "identifier" > M< / span > < span class = "plain" > ; *< / span > < span class = "identifier" > return_Sm< / span > < span class = "plain" > = < / span > < span class = "identifier" > FIRST_IN_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "reserved" > section_md< / span > < span class = "plain" > , < / span > < span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > sections_md< / span > < span class = "plain" > );< / span >
< span class = "plain" > *< / span > < span class = "identifier" > named_as_module< / span > < span class = "plain" > = < / span > < span class = "constant" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > WRITE_TO< / span > < span class = "plain" > (< / span > < span class = "identifier" > title< / span > < span class = "plain" > , < / span > < span class = "string" > "the %S module"< / span > < span class = "plain" > , < / span > < span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > module_name< / span > < span class = "plain" > );< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > list< / 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" > "(%d) Module '%S'\n"< / span > < span class = "plain" > , < / span > < span class = "identifier" > finds< / span > < span class = "plain" > , < / span > < span class = "identifier" > M< / span > < span class = "plain" > -> < / span > < span class = "element" > module_name< / span > < span class = "plain" > );< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP9_1" > § 9.1< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP9_1_2" > < / a > < b > § 9.1.2. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Found first section in chapter< / span > < span class = "cwebmacronumber" > 9.1.2< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
< span class = "identifier" > finds< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > finds< / span > < span class = "plain" > == < / span > < span class = "constant" > 1< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > *< / span > < span class = "identifier" > return_M< / span > < span class = "plain" > = < / span > < span class = "identifier" > M< / span > < span class = "plain" > ; *< / span > < span class = "identifier" > return_Sm< / span > < span class = "plain" > = < / span > < span class = "identifier" > FIRST_IN_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "reserved" > section_md< / span > < span class = "plain" > , < / span > < span class = "identifier" > Cm< / span > < span class = "plain" > -> < / span > < span class = "element" > sections_md< / span > < span class = "plain" > );< / span >
< span class = "identifier" > WRITE_TO< / span > < span class = "plain" > (< / span > < span class = "identifier" > title< / span > < span class = "plain" > , < / span > < span class = "string" > "%S"< / span > < span class = "plain" > , < / span > < span class = "identifier" > Cm< / span > < span class = "plain" > -> < / span > < span class = "element" > ch_title< / span > < span class = "plain" > );< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > list< / 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" > "(%d) Chapter '%S'\n"< / span > < span class = "plain" > , < / span > < span class = "identifier" > finds< / span > < span class = "plain" > , < / span > < span class = "identifier" > Cm< / span > < span class = "plain" > -> < / span > < span class = "element" > ch_title< / span > < span class = "plain" > );< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP9_1" > § 9.1< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP9_1_3" > < / a > < b > § 9.1.3. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Found section by name< / span > < span class = "cwebmacronumber" > 9.1.3< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
< span class = "identifier" > finds< / span > < span class = "plain" > ++;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > finds< / span > < span class = "plain" > == < / span > < span class = "constant" > 1< / span > < span class = "plain" > ) {< / span >
< span class = "plain" > *< / span > < span class = "identifier" > return_M< / span > < span class = "plain" > = < / span > < span class = "identifier" > M< / span > < span class = "plain" > ; *< / span > < span class = "identifier" > return_Sm< / span > < span class = "plain" > = < / span > < span class = "identifier" > Sm< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > WRITE_TO< / span > < span class = "plain" > (< / span > < span class = "identifier" > title< / span > < span class = "plain" > , < / span > < span class = "string" > "%S"< / span > < span class = "plain" > , < / span > < span class = "identifier" > Sm< / span > < span class = "plain" > -> < / span > < span class = "element" > sect_title< / span > < span class = "plain" > );< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > list< / 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" > "(%d) Section '%S'\n"< / span > < span class = "plain" > , < / span > < span class = "identifier" > finds< / span > < span class = "plain" > , < / span > < span class = "identifier" > Sm< / span > < span class = "plain" > -> < / span > < span class = "element" > sect_title< / span > < span class = "plain" > );< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP9_1" > § 9.1< / a > .< / p >
2019-03-12 23:32:12 +00:00
< hr class = "tocbar" >
2020-04-02 12:30:38 +00:00
< ul class = "toc" > < li > < a href = "8-bdfw.html" > Back to 'Bibliographic Data for Webs'< / a > < / li > < li > < a href = "8-bf.html" > Continue with 'Build Files'< / a > < / li > < / ul > < hr class = "tocbar" >
2019-03-18 11:16:10 +00:00
<!-- End of weave -->
2020-03-19 00:03:04 +00:00
< / main >
2019-02-04 22:26:45 +00:00
< / body >
< / html >