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 >
< title > 2/tp< / 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" >
2019-02-09 12:33:40 +00:00
<!-- Weave of '2/pm' generated by 7 -->
2020-03-23 15:04:43 +00:00
< ul class = "crumbs" > < li > < a href = "../webs.html" > Source< / a > < / li > < li > < a href = "index.html" > inweb< / a > < / li > < li > < a href = "index.html#2" > Chapter 2: Parsing a Web< / a > < / li > < li > < b > Paragraph Macros< / b > < / li > < / ul > < p class = "purpose" > To manage the set of named paragraph macros in a section.< / p >
2019-02-04 22:26:45 +00:00
< ul class = "toc" > < li > < a href = "#SP3" > § 3. Paragraph macro search< / a > < / li > < / ul > < hr class = "tocbar" >
< p class = "inwebparagraph" > < a id = "SP1" > < / a > < b > § 1. < / b > We store these like so:
< / p >
< pre class = "display" >
< span class = "reserved" > typedef< / span > < span class = "plain" > < / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > para_macro< / span > < span class = "plain" > {< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > macro_name< / span > < span class = "plain" > ; < / span > < span class = "comment" > usually long, like "Create a paragraph macro here"< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > paragraph< / span > < span class = "plain" > *< / span > < span class = "identifier" > defining_paragraph< / span > < span class = "plain" > ; < / span > < span class = "comment" > as printed in small type after the name in any usage< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > defn_start< / span > < span class = "plain" > ; < / span > < span class = "comment" > it ends at the end of its defining paragraph< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > linked_list< / span > < span class = "plain" > *< / span > < span class = "identifier" > macro_usages< / span > < span class = "plain" > ; < / span > < span class = "comment" > of < code class = "display" > < span class = "extract" > macro_usage< / span > < / code > : only computed for weaves< / span >
< span class = "constant" > MEMORY_MANAGEMENT< / span >
< span class = "plain" > } < / span > < span class = "reserved" > para_macro< / span > < span class = "plain" > ;< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > The structure para_macro is accessed in 2/pn, 3/tw, 3/tt, 5/ptf, 5/tf, 5/hf and here.< / p >
< p class = "inwebparagraph" > < a id = "SP2" > < / a > < b > § 2. < / b > Each section has its own linked list of paragraph macros, since the scope for
the usage of these is always a single section.
< / p >
< pre class = "display" >
< span class = "reserved" > para_macro< / span > < span class = "plain" > *< / span > < span class = "functiontext" > Macros::create< / span > < span class = "plain" > (< / span > < span class = "reserved" > section< / span > < span class = "plain" > *< / span > < span class = "identifier" > S< / span > < span class = "plain" > , < / span > < span class = "reserved" > paragraph< / span > < span class = "plain" > *< / span > < span class = "identifier" > P< / span > < span class = "plain" > , < / span > < span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > L< / span > < span class = "plain" > , < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > name< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > para_macro< / span > < span class = "plain" > *< / span > < span class = "identifier" > pmac< / span > < span class = "plain" > = < / span > < span class = "identifier" > CREATE< / span > < span class = "plain" > (< / span > < span class = "reserved" > para_macro< / span > < span class = "plain" > );< / span >
< span class = "identifier" > pmac< / span > < span class = "plain" > -< / span > < span class = "element" > > macro_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" > pmac< / span > < span class = "plain" > -< / span > < span class = "element" > > defining_paragraph< / span > < span class = "plain" > = < / span > < span class = "identifier" > P< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > P< / span > < span class = "plain" > -< / span > < span class = "element" > > defines_macro< / span > < span class = "plain" > = < / span > < span class = "identifier" > pmac< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > pmac< / span > < span class = "plain" > -< / span > < span class = "element" > > defn_start< / span > < span class = "plain" > = < / span > < span class = "identifier" > L< / span > < span class = "plain" > -< / span > < span class = "element" > > next_line< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > pmac< / span > < span class = "plain" > -< / span > < span class = "element" > > macro_usages< / span > < span class = "plain" > = < / span > < span class = "identifier" > NEW_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "reserved" > macro_usage< / span > < span class = "plain" > );< / span >
< span class = "identifier" > ADD_TO_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > pmac< / span > < span class = "plain" > , < / span > < span class = "reserved" > para_macro< / span > < span class = "plain" > , < / span > < span class = "identifier" > S< / span > < span class = "plain" > -< / span > < span class = "element" > > macros< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > pmac< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > The function Macros::create is used in 2/tp (< a href = "2-tp.html#SP1_1_6_4" > § 1.1.6.4< / a > ).< / p >
< p class = "inwebparagraph" > < a id = "SP3" > < / a > < b > § 3. Paragraph macro search. < / b > The scope for looking up paragraph macro names is a single section, not the
entire web. So you can't expand a macro from another section, but then again,
you can use the same macro name twice in different sections; and lookup is
much faster.
< / p >
< pre class = "display" >
< span class = "reserved" > para_macro< / span > < span class = "plain" > *< / span > < span class = "functiontext" > Macros::find_by_name< / span > < span class = "plain" > (< / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > name< / span > < span class = "plain" > , < / span > < span class = "reserved" > section< / span > < span class = "plain" > *< / span > < span class = "identifier" > scope< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > para_macro< / span > < span class = "plain" > *< / span > < span class = "identifier" > pmac< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > LOOP_OVER_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > pmac< / span > < span class = "plain" > , < / span > < span class = "reserved" > para_macro< / span > < span class = "plain" > , < / span > < span class = "identifier" > scope< / span > < span class = "plain" > -< / span > < span class = "element" > > 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" > name< / span > < span class = "plain" > , < / span > < span class = "identifier" > pmac< / span > < span class = "plain" > -< / span > < span class = "element" > > macro_name< / span > < span class = "plain" > ))< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > pmac< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > The function Macros::find_by_name is used in 2/pn (< a href = "2-pn.html#SP1_1" > § 1.1< / a > ), 3/tw (< a href = "3-tw.html#SP1_3_3_1_9_6" > § 1.3.3.1.9.6< / a > ), 3/tt (< a href = "3-tt.html#SP3_1" > § 3.1< / a > ).< / p >
2019-03-12 23:32:12 +00:00
< hr class = "tocbar" >
< ul class = "toc" > < li > < a href = "2-tp.html" > Back to 'The Parser'< / a > < / li > < li > < a href = "2-tgs.html" > Continue with 'Tags'< / 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 >