2020-04-10 15:23:50 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
< html >
< head >
< title > Structures and Functions< / 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" >
2020-04-10 20:29:28 +00:00
2020-04-10 15:23:50 +00:00
< / 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 'Structures and Functions' 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#4" > Chapter 4: Languages< / a > < / li > < li > < b > Structures and Functions< / b > < / li > < / ul > < p class = "purpose" > Basic support for languages to recognise structure and function declarations.< / p >
< ul class = "toc" > < li > < a href = "#SP6" > § 6. Functions< / a > < / li > < li > < a href = "#SP8" > § 8. Cataloguing< / a > < / li > < / ul > < hr class = "tocbar" >
< p class = "inwebparagraph" > < a id = "SP1" > < / a > < b > § 1. < / b > For each < code class = "display" > < span class = "extract" > typedef struct< / span > < / code > we find, we will make one of these:
< / p >
< pre class = "display" >
< span class = "reserved" > typedef< / span > < span class = "plain" > < / span > < span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > c_structure< / 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" > structure_name< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > tangled< / span > < span class = "plain" > ; < / span > < span class = "comment" > whether the structure definition has been tangled out< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > structure_header_at< / span > < span class = "plain" > ; < / span > < span class = "comment" > opening line of < code class = "display" > < span class = "extract" > typedef< / span > < / code > < / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > typedef_ends< / span > < span class = "plain" > ; < / span > < span class = "comment" > closing line, where < code class = "display" > < span class = "extract" > }< / span > < / code > appears< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > linked_list< / span > < span class = "plain" > *< / span > < span class = "identifier" > incorporates< / span > < span class = "plain" > ; < / span > < span class = "comment" > of < code class = "display" > < span class = "extract" > c_structure< / span > < / code > < / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > linked_list< / span > < span class = "plain" > *< / span > < span class = "identifier" > elements< / span > < span class = "plain" > ; < / span > < span class = "comment" > of < code class = "display" > < span class = "extract" > structure_element< / span > < / code > < / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "identifier" > next_cst_alphabetically< / span > < span class = "plain" > ;< / span >
< span class = "constant" > MEMORY_MANAGEMENT< / span >
< span class = "plain" > } < / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > ;< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > The structure c_structure is accessed in 3/tw, 4/cl and here.< / p >
< p class = "inwebparagraph" > < a id = "SP2" > < / a > < b > § 2. < / b > < / p >
< pre class = "display" >
< span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "identifier" > first_cst_alphabetically< / span > < span class = "plain" > = < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ;< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "functiontext" > Structures::new_struct< button class = "popup" onclick = "togglePopup('usagePopup111')" > ...< span class = "popuptext" id = "usagePopup111" > Usage of < b > Structures::new_struct< / b > :< br > C-Like Languages - < a href = "4-cl.html#SP2_1" > § 2.1< / a > < / span > < / button > < / span > < span class = "reserved" > web< / span > < span class = "plain" > *< / span > < span class = "identifier" > W< / span > < span class = "plain" > , < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > name< / span > < span class = "plain" > , < / span > < span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > L< / span > < span class = "plain" > ) {< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "identifier" > str< / span > < span class = "plain" > = < / span > < span class = "identifier" > CREATE< / span > < span class = "plain" > (< / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > );< / span >
< < span class = "cwebmacro" > Initialise the C structure structure< / span > < span class = "cwebmacronumber" > 2.1< / span > > < span class = "plain" > ;< / span >
2020-04-11 20:39:43 +00:00
< span class = "functiontext" > < a href = "3-ta.html#SP10" > Analyser::mark_reserved_word_at_line< / a > < / span > < span class = "identifier" > L< / span > < span class = "plain" > , < / span > < span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > structure_name< / span > < span class = "plain" > , < / span > < span class = "constant" > RESERVED_COLOUR< / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +00:00
< < span class = "cwebmacro" > Add this to the lists for its web and its paragraph< / span > < span class = "cwebmacronumber" > 2.2< / span > > < span class = "plain" > ;< / span >
< < span class = "cwebmacro" > Insertion-sort this into the alphabetical list of all structures found< / span > < span class = "cwebmacronumber" > 2.3< / span > > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > str< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP2_1" > < / a > < b > § 2.1. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Initialise the C structure structure< / span > < span class = "cwebmacronumber" > 2.1< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
2020-04-11 20:39:43 +00:00
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > structure_name< / span > < span class = "plain" > = < / span > < span class = "functiontext" > < a href = "4-sm.html#SP3" > Str::duplicate< / a > < / span > < span class = "identifier" > name< / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > structure_header_at< / span > < span class = "plain" > = < / span > < span class = "identifier" > L< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > tangled< / span > < span class = "plain" > = < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > typedef_ends< / span > < span class = "plain" > = < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > incorporates< / span > < span class = "plain" > = < / span > < span class = "identifier" > NEW_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > );< / span >
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > elements< / span > < span class = "plain" > = < / span > < span class = "identifier" > NEW_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "reserved" > structure_element< / span > < span class = "plain" > );< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP2" > § 2< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP2_2" > < / a > < b > § 2.2. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Add this to the lists for its web and its paragraph< / span > < span class = "cwebmacronumber" > 2.2< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
2020-04-11 20:39:43 +00:00
< span class = "functiontext" > < a href = "2-tgs.html#SP4" > Tags::add_by_name< / a > < / span > < span class = "identifier" > L< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_paragraph< / span > < span class = "plain" > , < / span > < span class = "identifier" > I< / span > < span class = "string" > "Structures"< / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > ADD_TO_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > str< / span > < span class = "plain" > , < / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > , < / span > < span class = "identifier" > W< / span > < span class = "plain" > -> < / span > < span class = "element" > c_structures< / span > < span class = "plain" > );< / span >
< span class = "identifier" > ADD_TO_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > str< / span > < span class = "plain" > , < / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > , < / span > < span class = "identifier" > L< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_paragraph< / span > < span class = "plain" > -> < / span > < span class = "element" > structures< / span > < span class = "plain" > );< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP2" > § 2< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP2_3" > < / a > < b > § 2.3. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Insertion-sort this into the alphabetical list of all structures found< / span > < span class = "cwebmacronumber" > 2.3< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > next_cst_alphabetically< / span > < span class = "plain" > = < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > first_cst_alphabetically< / span > < span class = "plain" > == < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ) < / span > < span class = "identifier" > first_cst_alphabetically< / span > < span class = "plain" > = < / span > < span class = "identifier" > str< / 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" > placed< / span > < span class = "plain" > = < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "identifier" > last< / span > < span class = "plain" > = < / span > < span class = "identifier" > NULL< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > for< / span > < span class = "plain" > (< / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "identifier" > seq< / span > < span class = "plain" > = < / span > < span class = "identifier" > first_cst_alphabetically< / span > < span class = "plain" > ; < / span > < span class = "identifier" > seq< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > seq< / span > < span class = "plain" > = < / span > < span class = "identifier" > seq< / span > < span class = "plain" > -> < / span > < span class = "identifier" > next_cst_alphabetically< / span > < span class = "plain" > ) {< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > < a href = "4-sm.html#SP19" > Str::cmp< / a > < / span > < span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > structure_name< / span > < span class = "plain" > , < / span > < span class = "identifier" > seq< / span > < span class = "plain" > -> < / span > < span class = "element" > structure_name< / span > < span class = "plain" > ) < < / span > < span class = "constant" > 0< / span > < span class = "plain" > ) {< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > seq< / span > < span class = "plain" > == < / span > < span class = "identifier" > first_cst_alphabetically< / span > < span class = "plain" > ) {< / span >
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > next_cst_alphabetically< / span > < span class = "plain" > = < / span > < span class = "identifier" > first_cst_alphabetically< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > first_cst_alphabetically< / span > < span class = "plain" > = < / span > < span class = "identifier" > str< / span > < span class = "plain" > ;< / span >
< span class = "plain" > } < / span > < span class = "reserved" > else< / span > < span class = "plain" > {< / span >
< span class = "identifier" > last< / span > < span class = "plain" > -> < / span > < span class = "element" > next_cst_alphabetically< / span > < span class = "plain" > = < / span > < span class = "identifier" > str< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > next_cst_alphabetically< / span > < span class = "plain" > = < / span > < span class = "identifier" > seq< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "identifier" > placed< / span > < span class = "plain" > = < / span > < span class = "constant" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > break< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "identifier" > last< / span > < span class = "plain" > = < / span > < span class = "identifier" > seq< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > placed< / span > < span class = "plain" > == < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ) < / span > < span class = "identifier" > last< / span > < span class = "plain" > -> < / span > < span class = "element" > next_cst_alphabetically< / span > < span class = "plain" > = < / span > < span class = "identifier" > str< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP2" > § 2< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP3" > < / a > < b > § 3. < / b > A language can also create an instance of < code class = "display" > < span class = "extract" > structure_element< / span > < / code > to record the
existence of the element < code class = "display" > < span class = "extract" > val< / span > < / code > , and add it to the linked list of elements of
the structure being defined.
< / p >
< p class = "inwebparagraph" > In InC, only, certain element names used often in Inform's source code are
given mildly special treatment. This doesn't amount to much. < code class = "display" > < span class = "extract" > allow_sharing< / span > < / code >
has no effect on tangling, so it doesn't change the program. It simply
affects the reports in the woven code about where structures are used.
< / 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" > structure_element< / 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" > element_name< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > element_created_at< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > allow_sharing< / span > < span class = "plain" > ;< / span >
< span class = "constant" > MEMORY_MANAGEMENT< / span >
< span class = "plain" > } < / span > < span class = "reserved" > structure_element< / span > < span class = "plain" > ;< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > The structure structure_element is accessed in 3/tw, 4/cl and here.< / p >
< p class = "inwebparagraph" > < a id = "SP4" > < / a > < b > § 4. < / b > < / p >
< pre class = "display" >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > structure_element< / span > < span class = "plain" > *< / span > < span class = "functiontext" > Structures::new_element< button class = "popup" onclick = "togglePopup('usagePopup112')" > ...< span class = "popuptext" id = "usagePopup112" > Usage of < b > Structures::new_element< / b > :< br > C-Like Languages - < a href = "4-cl.html#SP2_1_1" > § 2.1.1< / a > < / span > < / button > < / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "identifier" > str< / span > < span class = "plain" > , < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > elname< / span > < span class = "plain" > ,< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > L< / span > < span class = "plain" > ) {< / span >
2020-04-11 20:39:43 +00:00
< span class = "functiontext" > < a href = "3-ta.html#SP10" > Analyser::mark_reserved_word_at_line< / a > < / span > < span class = "identifier" > L< / span > < span class = "plain" > , < / span > < span class = "identifier" > elname< / span > < span class = "plain" > , < / span > < span class = "constant" > ELEMENT_COLOUR< / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > structure_element< / span > < span class = "plain" > *< / span > < span class = "identifier" > elt< / span > < span class = "plain" > = < / span > < span class = "identifier" > CREATE< / span > < span class = "plain" > (< / span > < span class = "reserved" > structure_element< / span > < span class = "plain" > );< / span >
2020-04-11 20:39:43 +00:00
< span class = "identifier" > elt< / span > < span class = "plain" > -> < / span > < span class = "element" > element_name< / span > < span class = "plain" > = < / span > < span class = "functiontext" > < a href = "4-sm.html#SP3" > Str::duplicate< / a > < / span > < span class = "identifier" > elname< / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > elt< / span > < span class = "plain" > -> < / span > < span class = "element" > allow_sharing< / span > < span class = "plain" > = < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > elt< / span > < span class = "plain" > -> < / span > < span class = "element" > element_created_at< / span > < span class = "plain" > = < / span > < span class = "identifier" > L< / span > < span class = "plain" > ;< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > < a href = "4-lm.html#SP29" > LanguageMethods::share_element< / a > < / span > < span class = "identifier" > L< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_section< / span > < span class = "plain" > -> < / span > < span class = "element" > sect_language< / span > < span class = "plain" > , < / span > < span class = "identifier" > elname< / span > < span class = "plain" > ))< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > elt< / span > < span class = "plain" > -> < / span > < span class = "element" > allow_sharing< / span > < span class = "plain" > = < / span > < span class = "constant" > TRUE< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > ADD_TO_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > elt< / span > < span class = "plain" > , < / span > < span class = "reserved" > structure_element< / span > < span class = "plain" > , < / span > < span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > elements< / span > < span class = "plain" > );< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > elt< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP5" > < / a > < b > § 5. < / b > < / p >
< pre class = "display" >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "functiontext" > Structures::find_structure< button class = "popup" onclick = "togglePopup('usagePopup113')" > ...< span class = "popuptext" id = "usagePopup113" > Usage of < b > Structures::find_structure< / b > :< br > none< / span > < / button > < / span > < span class = "reserved" > web< / span > < span class = "plain" > *< / span > < span class = "identifier" > W< / span > < span class = "plain" > , < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > name< / span > < span class = "plain" > ) {< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "identifier" > str< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > LOOP_OVER_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > str< / span > < span class = "plain" > , < / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > , < / span > < span class = "identifier" > W< / span > < span class = "plain" > -> < / span > < span class = "element" > c_structures< / span > < span class = "plain" > )< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > < a href = "4-sm.html#SP18" > Str::eq< / a > < / span > < span class = "identifier" > name< / span > < span class = "plain" > , < / span > < span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > structure_name< / span > < span class = "plain" > ))< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > str< / 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 = "inwebparagraph" > < a id = "SP6" > < / a > < b > § 6. Functions. < / b > Each function definition found results in one of these structures being made:
< / 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" > function< / 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" > function_name< / span > < span class = "plain" > ; < / span > < span class = "comment" > e.g., < code class = "display" > < span class = "extract" > "cultivate"< / span > < / code > < / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > function_type< / span > < span class = "plain" > ; < / span > < span class = "comment" > e.g., < code class = "display" > < span class = "extract" > "tree *"< / span > < / code > < / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > function_arguments< / span > < span class = "plain" > ; < / span > < span class = "comment" > e.g., < code class = "display" > < span class = "extract" > "int rainfall)"< / span > < / code > : note < code class = "display" > < span class = "extract" > )< / span > < / code > < / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > function_header_at< / span > < span class = "plain" > ; < / span > < span class = "comment" > where the first line of the header begins< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > within_namespace< / span > < span class = "plain" > ; < / span > < span class = "comment" > written using InC namespace dividers< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > called_from_other_sections< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > call_freely< / span > < span class = "plain" > ;< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > usage_described< / span > < span class = "plain" > ;< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > no_conditionals< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > struct< / span > < span class = "plain" > < / span > < span class = "reserved" > source_line< / span > < span class = "plain" > *< / span > < span class = "identifier" > within_conditionals< / span > < span class = "plain" > [< / span > < span class = "constant" > MAX_CONDITIONAL_COMPILATION_STACK< / span > < span class = "plain" > ];< / span >
< span class = "constant" > MEMORY_MANAGEMENT< / span >
< span class = "plain" > } < / span > < span class = "reserved" > function< / span > < span class = "plain" > ;< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > The structure function is accessed in 3/tw, 4/cl and here.< / p >
< p class = "inwebparagraph" > < a id = "SP7" > < / a > < b > § 7. < / b > < / p >
< pre class = "display" >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > function< / span > < span class = "plain" > *< / span > < span class = "functiontext" > Structures::new_function< button class = "popup" onclick = "togglePopup('usagePopup114')" > ...< span class = "popuptext" id = "usagePopup114" > Usage of < b > Structures::new_function< / b > :< br > ACME Support - < a href = "4-as.html#SP4" > § 4< / a > , < a href = "4-as.html#SP5" > § 5< / a > < br > C-Like Languages - < a href = "4-cl.html#SP3_2_2" > § 3.2.2< / a > < / span > < / button > < / span > < span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > fname< / 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" > hash_table_entry< / span > < span class = "plain" > *< / span > < span class = "identifier" > hte< / span > < span class = "plain" > =< / span >
< span class = "functiontext" > < a href = "3-ta.html#SP10" > Analyser::mark_reserved_word_at_line< / a > < / span > < span class = "identifier" > L< / span > < span class = "plain" > , < / span > < span class = "identifier" > fname< / span > < span class = "plain" > , < / span > < span class = "constant" > FUNCTION_COLOUR< / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > function< / span > < span class = "plain" > *< / span > < span class = "identifier" > fn< / span > < span class = "plain" > = < / span > < span class = "identifier" > CREATE< / span > < span class = "plain" > (< / span > < span class = "reserved" > function< / span > < span class = "plain" > );< / span >
2020-04-11 20:39:43 +00:00
< span class = "identifier" > hte< / span > < span class = "plain" > -> < / span > < span class = "element" > as_function< / span > < span class = "plain" > = < / span > < span class = "identifier" > fn< / span > < span class = "plain" > ;< / span >
2020-04-10 15:23:50 +00:00
< < span class = "cwebmacro" > Initialise the function structure< / span > < span class = "cwebmacronumber" > 7.1< / span > > < span class = "plain" > ;< / span >
< < span class = "cwebmacro" > Add the function to its paragraph and line< / span > < span class = "cwebmacronumber" > 7.2< / span > > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > L< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_section< / span > < span class = "plain" > -> < / span > < span class = "element" > sect_language< / span > < span class = "plain" > -> < / span > < span class = "element" > supports_namespaces< / span > < span class = "plain" > )< / span >
< < span class = "cwebmacro" > Check that the function has its namespace correctly declared< / span > < span class = "cwebmacronumber" > 7.3< / span > > < span class = "plain" > ;< / span >
< span class = "reserved" > return< / span > < span class = "plain" > < / span > < span class = "identifier" > fn< / span > < span class = "plain" > ;< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "inwebparagraph" > < a id = "SP7_1" > < / a > < b > § 7.1. < / b > Note that we take a snapshot of the conditional compilation stack as
part of the function structure. We'll need it when predeclaring the function.
< / p >
< p class = "macrodefinition" > < code class = "display" >
< < span class = "cwebmacrodefn" > Initialise the function structure< / span > < span class = "cwebmacronumber" > 7.1< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
2020-04-11 20:39:43 +00:00
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > function_name< / span > < span class = "plain" > = < / span > < span class = "functiontext" > < a href = "4-sm.html#SP3" > Str::duplicate< / a > < / span > < span class = "identifier" > fname< / span > < span class = "plain" > );< / span >
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > function_arguments< / span > < span class = "plain" > = < / span > < span class = "functiontext" > < a href = "4-sm.html#SP2" > Str::new< / a > < / span > < span class = "plain" > );< / span >
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > function_type< / span > < span class = "plain" > = < / span > < span class = "functiontext" > < a href = "4-sm.html#SP2" > Str::new< / a > < / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > within_namespace< / span > < span class = "plain" > = < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > called_from_other_sections< / span > < span class = "plain" > = < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > call_freely< / span > < span class = "plain" > = < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > function_header_at< / span > < span class = "plain" > = < / span > < span class = "identifier" > L< / span > < span class = "plain" > ;< / span >
2020-04-11 20:39:43 +00:00
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > usage_described< / span > < span class = "plain" > = < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > ;< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > no_conditionals< / span > < span class = "plain" > = < / span > < span class = "constant" > 0< / span > < span class = "plain" > ;< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP7" > § 7< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP7_2" > < / a > < b > § 7.2. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Add the function to its paragraph and line< / span > < span class = "cwebmacronumber" > 7.2< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
< span class = "reserved" > paragraph< / span > < span class = "plain" > *< / span > < span class = "identifier" > P< / span > < span class = "plain" > = < / span > < span class = "identifier" > L< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_paragraph< / span > < span class = "plain" > ;< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > P< / span > < span class = "plain" > ) < / span > < span class = "identifier" > ADD_TO_LINKED_LIST< / span > < span class = "plain" > (< / span > < span class = "identifier" > fn< / span > < span class = "plain" > , < / span > < span class = "reserved" > function< / span > < span class = "plain" > , < / span > < span class = "identifier" > P< / span > < span class = "plain" > -> < / span > < span class = "element" > functions< / span > < span class = "plain" > );< / span >
< span class = "identifier" > L< / span > < span class = "plain" > -> < / span > < span class = "element" > function_defined< / span > < span class = "plain" > = < / span > < span class = "identifier" > fn< / span > < span class = "plain" > ;< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< p class = "endnote" > This code is used in < a href = "#SP7" > § 7< / a > .< / p >
< p class = "inwebparagraph" > < a id = "SP7_3" > < / a > < b > § 7.3. < / b > < code class = "display" >
< < span class = "cwebmacrodefn" > Check that the function has its namespace correctly declared< / span > < span class = "cwebmacronumber" > 7.3< / span > > =
< / code > < / p >
< pre class = "displaydefn" >
< span class = "reserved" > text_stream< / span > < span class = "plain" > *< / span > < span class = "identifier" > declared_namespace< / 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" > ambient_namespace< / span > < span class = "plain" > = < / span > < span class = "identifier" > L< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_section< / span > < span class = "plain" > -> < / span > < span class = "element" > sect_namespace< / span > < span class = "plain" > ;< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > match_results< / span > < span class = "plain" > < / span > < span class = "identifier" > mr< / span > < span class = "plain" > = < / span > < span class = "functiontext" > < a href = "4-pm.html#SP9" > Regexp::create_mr< / a > < / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > < a href = "4-pm.html#SP10" > Regexp::match< / a > < / span > < span class = "plain" > & < / span > < span class = "identifier" > mr< / span > < span class = "plain" > , < / span > < span class = "identifier" > fname< / span > < span class = "plain" > , < / span > < span class = "identifier" > L< / span > < span class = "string" > "(%c+::)%c*"< / span > < span class = "plain" > )) {< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > declared_namespace< / 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" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > within_namespace< / span > < span class = "plain" > = < / span > < span class = "constant" > TRUE< / span > < span class = "plain" > ;< / span >
2020-04-11 20:39:43 +00:00
< 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" > < a href = "4-sm.html#SP21" > Str::eq_wide_string< / a > < / span > < span class = "identifier" > fname< / span > < span class = "plain" > , < / span > < span class = "identifier" > L< / span > < span class = "string" > "main"< / span > < span class = "plain" > )) & & < / span >
< span class = "plain" > (< / span > < span class = "functiontext" > < a href = "4-sm.html#SP21" > Str::eq_wide_string< / a > < / span > < span class = "identifier" > ambient_namespace< / span > < span class = "plain" > , < / span > < span class = "identifier" > L< / span > < span class = "string" > "Main::"< / span > < span class = "plain" > )))< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > declared_namespace< / span > < span class = "plain" > = < / span > < span class = "identifier" > I< / span > < span class = "string" > "Main::"< / span > < span class = "plain" > ;< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > if< / span > < span class = "plain" > ((< / span > < span class = "functiontext" > < a href = "4-sm.html#SP18" > Str::ne< / a > < / span > < span class = "identifier" > declared_namespace< / span > < span class = "plain" > , < / span > < span class = "identifier" > ambient_namespace< / span > < span class = "plain" > )) & & < / span >
2020-04-10 15:23:50 +00:00
< span class = "plain" > (< / span > < span class = "identifier" > L< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_paragraph< / span > < span class = "plain" > -> < / span > < span class = "element" > placed_very_early< / span > < span class = "plain" > == < / span > < span class = "constant" > FALSE< / span > < span class = "plain" > )) {< / span >
< span class = "identifier" > TEMPORARY_TEXT< / span > < span class = "plain" > (< / span > < span class = "identifier" > err_mess< / span > < span class = "plain" > );< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > < a href = "4-sm.html#SP8" > Str::len< / a > < / span > < span class = "identifier" > declared_namespace< / span > < span class = "plain" > ) == < / span > < span class = "constant" > 0< / span > < span class = "plain" > )< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > WRITE_TO< / span > < span class = "plain" > (< / span > < span class = "identifier" > err_mess< / span > < span class = "plain" > , < / span > < span class = "string" > "Function '%S' should have namespace prefix '%S'"< / span > < span class = "plain" > ,< / span >
< span class = "identifier" > fname< / span > < span class = "plain" > , < / span > < span class = "identifier" > ambient_namespace< / span > < span class = "plain" > );< / span >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > else< / span > < span class = "plain" > < / span > < span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "functiontext" > < a href = "4-sm.html#SP8" > Str::len< / a > < / span > < span class = "identifier" > ambient_namespace< / span > < span class = "plain" > ) == < / span > < span class = "constant" > 0< / span > < span class = "plain" > )< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > WRITE_TO< / span > < span class = "plain" > (< / span > < span class = "identifier" > err_mess< / span > < span class = "plain" > , < / span > < span class = "string" > "Function '%S' declared in a section with no namespace"< / span > < span class = "plain" > ,< / span >
< span class = "identifier" > fname< / span > < span class = "plain" > );< / span >
< span class = "reserved" > else< / span >
< span class = "identifier" > WRITE_TO< / span > < span class = "plain" > (< / span > < span class = "identifier" > err_mess< / span > < span class = "plain" > , < / span > < span class = "string" > "Function '%S' declared in a section with the wrong namespace '%S'"< / span > < span class = "plain" > ,< / span >
< span class = "identifier" > fname< / span > < span class = "plain" > , < / span > < span class = "identifier" > ambient_namespace< / span > < span class = "plain" > );< / span >
2020-04-11 20:39:43 +00:00
< span class = "functiontext" > < a href = "1-pc.html#SP8" > Main::error_in_web< / a > < / span > < span class = "identifier" > err_mess< / span > < span class = "plain" > , < / span > < span class = "identifier" > L< / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +00:00
< span class = "identifier" > DISCARD_TEXT< / span > < span class = "plain" > (< / span > < span class = "identifier" > err_mess< / span > < span class = "plain" > );< / span >
< span class = "plain" > }< / span >
2020-04-11 20:39:43 +00:00
< span class = "functiontext" > < a href = "4-pm.html#SP9" > Regexp::dispose_of< / a > < / span > < span class = "plain" > & < / span > < span class = "identifier" > mr< / span > < span class = "plain" > );< / span >
2020-04-10 15:23:50 +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. Cataloguing. < / b > This implements the additional information in the < code class = "display" > < span class = "extract" > -structures< / span > < / code > and < code class = "display" > < span class = "extract" > -functions< / span > < / code >
forms of section catalogue.
< / p >
< pre class = "display" >
2020-04-11 20:39:43 +00:00
< span class = "reserved" > void< / span > < span class = "plain" > < / span > < span class = "functiontext" > Structures::catalogue< button class = "popup" onclick = "togglePopup('usagePopup115')" > ...< span class = "popuptext" id = "usagePopup115" > Usage of < b > Structures::catalogue< / b > :< br > The Analyser - < a href = "3-ta.html#SP2" > § 2< / a > < / span > < / button > < / span > < span class = "reserved" > section< / span > < span class = "plain" > *< / span > < span class = "identifier" > S< / span > < span class = "plain" > , < / span > < span class = "reserved" > int< / span > < span class = "plain" > < / span > < span class = "identifier" > functions_too< / span > < span class = "plain" > ) {< / span >
2020-04-10 15:23:50 +00:00
< span class = "reserved" > c_structure< / span > < span class = "plain" > *< / span > < span class = "identifier" > str< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > LOOP_OVER< / span > < span class = "plain" > (< / span > < span class = "identifier" > str< / span > < span class = "plain" > , < / span > < span class = "reserved" > c_structure< / span > < span class = "plain" > )< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > structure_header_at< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_section< / span > < span class = "plain" > == < / span > < span class = "identifier" > S< / span > < span class = "plain" > )< / span >
< span class = "identifier" > PRINT< / span > < span class = "plain" > (< / span > < span class = "string" > " %S "< / span > < span class = "plain" > , < / span > < span class = "identifier" > str< / span > < span class = "plain" > -> < / span > < span class = "element" > structure_name< / span > < span class = "plain" > );< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > functions_too< / span > < span class = "plain" > ) {< / span >
< span class = "reserved" > function< / span > < span class = "plain" > *< / span > < span class = "identifier" > fn< / span > < span class = "plain" > ;< / span >
< span class = "identifier" > LOOP_OVER< / span > < span class = "plain" > (< / span > < span class = "identifier" > fn< / span > < span class = "plain" > , < / span > < span class = "reserved" > function< / span > < span class = "plain" > )< / span >
< span class = "reserved" > if< / span > < span class = "plain" > (< / span > < span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > function_header_at< / span > < span class = "plain" > -> < / span > < span class = "element" > owning_section< / span > < span class = "plain" > == < / span > < span class = "identifier" > S< / span > < span class = "plain" > )< / span >
< span class = "identifier" > PRINT< / span > < span class = "plain" > (< / span > < span class = "string" > "\n %S"< / span > < span class = "plain" > , < / span > < span class = "identifier" > fn< / span > < span class = "plain" > -> < / span > < span class = "element" > function_name< / span > < span class = "plain" > );< / span >
< span class = "plain" > }< / span >
< span class = "plain" > }< / span >
< / pre >
< p class = "inwebparagraph" > < / p >
< hr class = "tocbar" >
< ul class = "toc" > < li > < a href = "4-pl.html" > Back to 'Programming Languages'< / a > < / li > < li > < a href = "4-lm.html" > Continue with 'Language Methods'< / a > < / li > < / ul > < hr class = "tocbar" >
<!-- End of weave -->
2020-04-11 20:39:43 +00:00
< script >
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
< / script >
< link href = "Popups.css" rel = "stylesheet" rev = "stylesheet" type = "text/css" >
2020-04-10 15:23:50 +00:00
< / main >
< / body >
< / html >