about summary refs log tree commit diff stats
path: root/src/otr/otr.h
Commit message (Expand)AuthorAgeFilesLines
* Added license exemption for OpenSSL to source headersJames Booth2014-08-241-0/+12
* Free resources on OTR shutdownJames Booth2014-06-261-0/+1
* Added deallocation function for string prefs, added otr policy enumJames Booth2014-06-181-1/+7
* Moved OTR policy check to otr moduleJames Booth2014-05-111-0/+2
* Added question answer authentication (libotr 3.2.x)James Booth2014-04-301-0/+2
* Attempt at shared secret authentication for libotr 4.0.0James Booth2014-04-281-0/+1
* Added SMP secret libotr 4.0.0 handlersJames Booth2014-04-271-0/+7
* Handle SMP secret responseJames Booth2014-04-261-1/+1
* Send SMP init message with /otr secretJames Booth2014-04-261-0/+2
* Updated copyrightJames Booth2014-03-091-1/+1
* Added OTR supported versions in initial start query messageJames Booth2014-02-181-0/+1
* Mock otr module for cmd_otr testsJames Booth2014-02-161-15/+17
* Moved otr sources into folderJames Booth2014-02-121-0/+51
'>151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
<title>Mu - 038new_text.cc</title>
<meta name="Generator" content="Vim/7.4">
<meta name="plugin-version" content="vim7.4_v2">
<meta name="syntax" content="cpp">
<meta name="settings" content="number_lines,use_css,pre_wrap,no_foldcolumn,expand_tabs,line_ids,prevent_copy=">
<meta name="colorscheme" content="minimal">
<style type="text/css">
<!--
pre { white-space: pre-wrap; font-family: monospace; color: #aaaaaa; background-color: #080808; }
body { font-size: 12pt; font-family: monospace; color: #aaaaaa; background-color: #080808; }
a { color:#eeeeee; text-decoration: none; }
a:hover { text-decoration: underline; }
* { font-size: 12pt; font-size: 1em; }
.Constant { color: #00a0a0; }
.muRecipe { color: #ff8700; }
.Special { color: #c00000; }
.Conceal { color: #4e4e4e; }
.cSpecial { color: #008000; }
.SalientComment { color: #00ffff; }
.Comment { color: #9090ff; }
.Comment a { color:#0000ee; text-decoration:underline; }
.Delimiter { color: #800080; }
.LineNr { color: #444444; }
.Identifier { color: #c0a020; }
.Normal { color: #aaaaaa; background-color: #080808; padding-bottom: 1px; }
.CommentedCode { color: #6c6c6c; }
.traceContains { color: #008000; }
-->
</style>

<script type='text/javascript'>
<!--

/* function to open any folds containing a jumped-to line before jumping to it */
function JumpToLine()
{
  var lineNum;
  lineNum = window.location.hash;
  lineNum = lineNum.substr(1); /* strip off '#' */

  if (lineNum.indexOf('L') == -1) {
    lineNum = 'L'+lineNum;
  }
  lineElem = document.getElementById(lineNum);
  /* Always jump to new location even if the line was hidden inside a fold, or
   * we corrected the raw number to a line ID.
   */
  if (lineElem) {
    lineElem.scrollIntoView(true);
  }
  return true;
}
if ('onhashchange' in window) {
  window.onhashchange = JumpToLine;
}

-->
</script>
</head>
<body onload='JumpToLine();'>
<pre id='vimCodeElement'>
<span id="L1" class="LineNr">  1 </span><span class="Comment">//: Extend 'new' to handle a unicode string literal argument or 'text'.</span>
<span id="L2" class="LineNr">  2 </span>
<span id="L3" class="LineNr">  3 </span><span class="Comment">//: A Mu text is an address to an array of characters.</span>
<span id="L4" class="LineNr">  4 </span><span class="Delimiter">:(before &quot;End Mu Types Initialization&quot;)</span>
<span id="L5" class="LineNr">  5 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Type_abbreviations<span class="Delimiter">,</span> <span class="Constant">&quot;text&quot;</span><span class="Delimiter">,</span> <a href='018type_abbreviations.cc.html#L58'>new_type_tree</a><span class="Delimiter">(</span><span class="Constant">&quot;address:array:character&quot;</span><span class="Delimiter">));</span>
<span id="L6" class="LineNr">  6 </span>
<span id="L7" class="LineNr">  7 </span><span class="Delimiter">:(scenario new_string)</span>
<span id="L8" class="LineNr">  8 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L9" class="LineNr">  9 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc def]
<span id="L10" class="LineNr"> 10 </span>  <span class="Constant">2</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>index *<span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">5</span>
<span id="L11" class="LineNr"> 11 </span>]
<span id="L12" class="LineNr"> 12 </span><span class="Comment"># number code for 'e'</span>
<span id="L13" class="LineNr"> 13 </span><span class="traceContains">+mem: storing 101 in location 2</span>
<span id="L14" class="LineNr"> 14 </span>
<span id="L15" class="LineNr"> 15 </span><span class="Delimiter">:(scenario new_string_handles_unicode)</span>
<span id="L16" class="LineNr"> 16 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L17" class="LineNr"> 17 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [a«c]
<span id="L18" class="LineNr"> 18 </span>  <span class="Constant">2</span>:num<span class="Special"> &lt;- </span>length *<span class="Constant">1</span>:text
<span id="L19" class="LineNr"> 19 </span>  <span class="Constant">3</span>:<span class="Normal">char</span><span class="Special"> &lt;- </span>index *<span class="Constant">1</span>:text<span class="Delimiter">,</span> <span class="Constant">1</span>
<span id="L20" class="LineNr"> 20 </span>]
<span id="L21" class="LineNr"> 21 </span><span class="traceContains">+mem: storing 3 in location 2</span>
<span id="L22" class="LineNr"> 22 </span><span class="Comment"># unicode for '«'</span>
<span id="L23" class="LineNr"> 23 </span><span class="traceContains">+mem: storing 171 in location 3</span>
<span id="L24" class="LineNr"> 24 </span>
<span id="L25" class="LineNr"> 25 </span><span class="Delimiter">:(before &quot;End NEW Check Special-cases&quot;)</span>
<span id="L26" class="LineNr"> 26 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L27" class="LineNr"> 27 </span><span class="Delimiter">:(before &quot;Convert 'new' To 'allocate'&quot;)</span>
<span id="L28" class="LineNr"> 28 </span><span class="Normal">if</span> <span class="Delimiter">(</span>inst<span class="Delimiter">.</span>name == <span class="Constant">&quot;new&quot;</span> &amp;&amp; !inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>empty<span class="Delimiter">()</span> &amp;&amp; <a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Identifier">continue</span><span class="Delimiter">;</span>
<span id="L29" class="LineNr"> 29 </span><span class="Delimiter">:(after &quot;case NEW&quot; following &quot;Primitive Recipe Implementations&quot;)</span>
<span id="L30" class="LineNr"> 30 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span><a href='026call.cc.html#L85'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L31" class="LineNr"> 31 </span>  <span class="Conceal">¦</span> products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L32" class="LineNr"> 32 </span>  <span class="Conceal">¦</span> products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span><a href='026call.cc.html#L85'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>name<span class="Delimiter">));</span>
<span id="L33" class="LineNr"> 33 </span>  <span class="Conceal">¦</span> <a href='003trace.cc.html#L161'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;new string alloc: &quot;</span> &lt;&lt; products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L34" class="LineNr"> 34 </span>  <span class="Conceal">¦</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L35" class="LineNr"> 35 </span>  <span class="Delimiter">}</span>
<span id="L36" class="LineNr"> 36 </span>
<span id="L37" class="LineNr"> 37 </span><span class="Delimiter">:(code)</span>
<span id="L38" class="LineNr"> 38 </span><span class="Normal">int</span> <a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; contents<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L39" class="LineNr"> 39 </span>  <span class="Comment">// allocate an array just large enough for it</span>
<span id="L40" class="LineNr"> 40 </span>  <span class="Normal">int</span> string_length = <a href='038new_text.cc.html#L131'>unicode_length</a><span class="Delimiter">(</span>contents<span class="Delimiter">);</span>
<span id="L41" class="LineNr"> 41 </span><span class="CommentedCode">//?   Total_alloc += string_length+1;</span>
<span id="L42" class="LineNr"> 42 </span><span class="CommentedCode">//?   ++Num_alloc;</span>
<span id="L43" class="LineNr"> 43 </span>  <span class="Normal">int</span> result = allocate<span class="Delimiter">(</span>string_length+<span class="Comment">/*</span><span class="Comment">array length</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L44" class="LineNr"> 44 </span>  <a href='003trace.cc.html#L161'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string refcount 0 in location &quot;</span> &lt;&lt; result &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L45" class="LineNr"> 45 </span>  <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> result<span class="Delimiter">,</span> <span class="Constant">0</span><span class="Delimiter">);</span>
<span id="L46" class="LineNr"> 46 </span>  <span class="Normal">int</span> curr_address = result+<span class="Comment">/*</span><span class="Comment">skip refcount</span><span class="Comment">*/</span><span class="Constant">1</span><span class="Delimiter">;</span>
<span id="L47" class="LineNr"> 47 </span>  <a href='003trace.cc.html#L161'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string length &quot;</span> &lt;&lt; string_length &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr_address &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L48" class="LineNr"> 48 </span>  <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> string_length<span class="Delimiter">);</span>
<span id="L49" class="LineNr"> 49 </span>  ++curr_address<span class="Delimiter">;</span>  <span class="Comment">// skip length</span>
<span id="L50" class="LineNr"> 50 </span>  <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L51" class="LineNr"> 51 </span>  <span class="Normal">const</span> <span class="Normal">char</span>* raw_contents = contents<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
<span id="L52" class="LineNr"> 52 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> i = <span class="Constant">0</span><span class="Delimiter">;</span>  i &lt; string_length<span class="Delimiter">;</span>  ++i<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L53" class="LineNr"> 53 </span>  <span class="Conceal">¦</span> <span class="Normal">uint32_t</span> curr_character<span class="Delimiter">;</span>
<span id="L54" class="LineNr"> 54 </span>  <span class="Conceal">¦</span> assert<span class="Delimiter">(</span>curr &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>contents<span class="Delimiter">));</span>
<span id="L55" class="LineNr"> 55 </span>  <span class="Conceal">¦</span> tb_utf8_char_to_unicode<span class="Delimiter">(</span>&amp;curr_character<span class="Delimiter">,</span> &amp;raw_contents[curr]<span class="Delimiter">);</span>
<span id="L56" class="LineNr"> 56 </span>  <span class="Conceal">¦</span> <a href='003trace.cc.html#L161'>trace</a><span class="Delimiter">(</span><span class="Constant">9999</span><span class="Delimiter">,</span> <span class="Constant">&quot;mem&quot;</span><span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;storing string character &quot;</span> &lt;&lt; curr_character &lt;&lt; <span class="Constant">&quot; in location &quot;</span> &lt;&lt; curr_address &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L57" class="LineNr"> 57 </span>  <span class="Conceal">¦</span> <a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr_address<span class="Delimiter">,</span> curr_character<span class="Delimiter">);</span>
<span id="L58" class="LineNr"> 58 </span>  <span class="Conceal">¦</span> curr += tb_utf8_char_length<span class="Delimiter">(</span>raw_contents[curr]<span class="Delimiter">);</span>
<span id="L59" class="LineNr"> 59 </span>  <span class="Conceal">¦</span> ++curr_address<span class="Delimiter">;</span>
<span id="L60" class="LineNr"> 60 </span>  <span class="Delimiter">}</span>
<span id="L61" class="LineNr"> 61 </span>  <span class="Comment">// Mu strings are not null-terminated in memory.</span>
<span id="L62" class="LineNr"> 62 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L63" class="LineNr"> 63 </span><span class="Delimiter">}</span>
<span id="L64" class="LineNr"> 64 </span>
<span id="L65" class="LineNr"> 65 </span><span class="Comment">//: a new kind of typo</span>
<span id="L66" class="LineNr"> 66 </span>
<span id="L67" class="LineNr"> 67 </span><span class="Delimiter">:(scenario string_literal_without_instruction)</span>
<span id="L68" class="LineNr"> 68 </span><span class="Special">% Hide_errors = true;</span>
<span id="L69" class="LineNr"> 69 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L70" class="LineNr"> 70 </span>  [abc]
<span id="L71" class="LineNr"> 71 </span>]
<span id="L72" class="LineNr"> 72 </span><span class="traceContains">+error: <a href='000organization.cc.html#L113'>main</a>: <a href='010vm.cc.html#L32'>instruction</a> '[abc]' has no <a href='010vm.cc.html#L19'>recipe</a> in '[abc]'</span>
<span id="L73" class="LineNr"> 73 </span>
<span id="L74" class="LineNr"> 74 </span><span class="Comment">//: stash recognizes strings</span>
<span id="L75" class="LineNr"> 75 </span>
<span id="L76" class="LineNr"> 76 </span><span class="Delimiter">:(scenario stash_string)</span>
<span id="L77" class="LineNr"> 77 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L78" class="LineNr"> 78 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
<span id="L79" class="LineNr"> 79 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:text
<span id="L80" class="LineNr"> 80 </span>]
<span id="L81" class="LineNr"> 81 </span><span class="traceContains">+app: foo: abc</span>
<span id="L82" class="LineNr"> 82 </span>
<span id="L83" class="LineNr"> 83 </span><span class="Delimiter">:(before &quot;End inspect Special-cases(r, data)&quot;)</span>
<span id="L84" class="LineNr"> 84 </span><span class="Normal">if</span> <span class="Delimiter">(</span><a href='027call_ingredient.cc.html#L174'>is_mu_text</a><span class="Delimiter">(</span>r<span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L85" class="LineNr"> 85 </span>  assert<span class="Delimiter">(</span>scalar<span class="Delimiter">(</span>data<span class="Delimiter">));</span>
<span id="L86" class="LineNr"> 86 </span>  <span class="Identifier">return</span> <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span>data<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
<span id="L87" class="LineNr"> 87 </span><span class="Delimiter">}</span>
<span id="L88" class="LineNr"> 88 </span>
<span id="L89" class="LineNr"> 89 </span><span class="Delimiter">:(before &quot;End $print Special-cases&quot;)</span>
<span id="L90" class="LineNr"> 90 </span><span class="Normal">else</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='027call_ingredient.cc.html#L174'>is_mu_text</a><span class="Delimiter">(</span><a href='026call.cc.html#L85'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L91" class="LineNr"> 91 </span>  cout &lt;&lt; <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span>i<span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">));</span>
<span id="L92" class="LineNr"> 92 </span><span class="Delimiter">}</span>
<span id="L93" class="LineNr"> 93 </span>
<span id="L94" class="LineNr"> 94 </span><span class="Delimiter">:(scenario unicode_string)</span>
<span id="L95" class="LineNr"> 95 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L96" class="LineNr"> 96 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [♠]
<span id="L97" class="LineNr"> 97 </span>  stash [foo:]<span class="Delimiter">,</span> <span class="Constant">1</span>:text
<span id="L98" class="LineNr"> 98 </span>]
<span id="L99" class="LineNr"> 99 </span><span class="traceContains">+app: foo: ♠</span>
<span id="L100" class="LineNr">100 </span>
<span id="L101" class="LineNr">101 </span><span class="Delimiter">:(scenario stash_space_after_string)</span>
<span id="L102" class="LineNr">102 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L103" class="LineNr">103 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
<span id="L104" class="LineNr">104 </span>  stash <span class="Constant">1</span>:text<span class="Delimiter">,</span> [foo]
<span id="L105" class="LineNr">105 </span>]
<span id="L106" class="LineNr">106 </span><span class="traceContains">+app: abc foo</span>
<span id="L107" class="LineNr">107 </span>
<span id="L108" class="LineNr">108 </span><span class="Delimiter">:(scenario stash_string_as_array)</span>
<span id="L109" class="LineNr">109 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L110" class="LineNr">110 </span>  <span class="Constant">1</span>:text<span class="Special"> &lt;- </span><span class="Normal">new</span> [abc]
<span id="L111" class="LineNr">111 </span>  stash *<span class="Constant">1</span>:text
<span id="L112" class="LineNr">112 </span>]
<span id="L113" class="LineNr">113 </span><span class="traceContains">+app: 3 97 98 99</span>
<span id="L114" class="LineNr">114 </span>
<span id="L115" class="LineNr">115 </span><span class="Comment">//: fixes way more than just stash</span>
<span id="L116" class="LineNr">116 </span><span class="Delimiter">:(before &quot;End Preprocess is_mu_text(reagent x)&quot;)</span>
<span id="L117" class="LineNr">117 </span><span class="Normal">if</span> <span class="Delimiter">(</span>!canonize_type<span class="Delimiter">(</span>x<span class="Delimiter">))</span> <span class="Identifier">return</span> <span class="Constant">false</span><span class="Delimiter">;</span>
<span id="L118" class="LineNr">118 </span>
<span id="L119" class="LineNr">119 </span><span class="Comment">//: Allocate more to routine when initializing a literal string</span>
<span id="L120" class="LineNr">120 </span><span class="Delimiter">:(scenario new_string_overflow)</span>
<span id="L121" class="LineNr">121 </span><span class="Special">% Initial_memory_per_routine = 3;</span>
<span id="L122" class="LineNr">122 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L123" class="LineNr">123 </span>  <span class="Constant">1</span>:address:num/<span class="Special">raw &lt;- </span><span class="Normal">new</span> <span class="Constant">number:type</span>
<span id="L124" class="LineNr">124 </span>  <span class="Constant">2</span>:text/<span class="Special">raw &lt;- </span><span class="Normal">new</span> [a]  <span class="Comment"># not enough room in initial page, if you take the refcount and array length into account</span>
<span id="L125" class="LineNr">125 </span>]
<span id="L126" class="LineNr">126 </span><span class="traceContains">+new: routine allocated memory from 1000 to 1003</span>
<span id="L127" class="LineNr">127 </span><span class="traceContains">+new: routine allocated memory from 1003 to 1006</span>
<span id="L128" class="LineNr">128 </span>
<span id="L129" class="LineNr">129 </span><span class="Comment">//: helpers</span>
<span id="L130" class="LineNr">130 </span><span class="Delimiter">:(code)</span>
<span id="L131" class="LineNr">131 </span><span class="Normal">int</span> <a href='038new_text.cc.html#L131'>unicode_length</a><span class="Delimiter">(</span><span class="Normal">const</span> string&amp; s<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L132" class="LineNr">132 </span>  <span class="Normal">const</span> <span class="Normal">char</span>* in = s<span class="Delimiter">.</span>c_str<span class="Delimiter">();</span>
<span id="L133" class="LineNr">133 </span>  <span class="Normal">int</span> result = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L134" class="LineNr">134 </span>  <span class="Normal">int</span> curr = <span class="Constant">0</span><span class="Delimiter">;</span>
<span id="L135" class="LineNr">135 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span>curr &lt; <a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>s<span class="Delimiter">))</span> <span class="Delimiter">{</span>  <span class="Comment">// carefully bounds-check on the string</span>
<span id="L136" class="LineNr">136 </span>  <span class="Conceal">¦</span> <span class="Comment">// before accessing its raw pointer</span>
<span id="L137" class="LineNr">137 </span>  <span class="Conceal">¦</span> ++result<span class="Delimiter">;</span>
<span id="L138" class="LineNr">138 </span>  <span class="Conceal">¦</span> curr += tb_utf8_char_length<span class="Delimiter">(</span>in[curr]<span class="Delimiter">);</span>
<span id="L139" class="LineNr">139 </span>  <span class="Delimiter">}</span>
<span id="L140" class="LineNr">140 </span>  <span class="Identifier">return</span> result<span class="Delimiter">;</span>
<span id="L141" class="LineNr">141 </span><span class="Delimiter">}</span>
<span id="L142" class="LineNr">142 </span>
<span id="L143" class="LineNr">143 </span>string <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span><span class="Normal">int</span> address<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L144" class="LineNr">144 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>address == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L145" class="LineNr">145 </span>  ++address<span class="Delimiter">;</span>  <span class="Comment">// skip refcount</span>
<span id="L146" class="LineNr">146 </span>  <span class="Normal">int</span> length = <a href='001help.cc.html#L228'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> address<span class="Delimiter">);</span>
<span id="L147" class="LineNr">147 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>length == <span class="Constant">0</span><span class="Delimiter">)</span> <span class="Identifier">return</span> <span class="Constant">&quot;&quot;</span><span class="Delimiter">;</span>
<span id="L148" class="LineNr">148 </span>  <span class="Identifier">return</span> <a href='038new_text.cc.html#L151'>read_mu_characters</a><span class="Delimiter">(</span>address+<span class="Constant">1</span><span class="Delimiter">,</span> length<span class="Delimiter">);</span>
<span id="L149" class="LineNr">149 </span><span class="Delimiter">}</span>
<span id="L150" class="LineNr">150 </span>
<span id="L151" class="LineNr">151 </span>string <a href='038new_text.cc.html#L151'>read_mu_characters</a><span class="Delimiter">(</span><span class="Normal">int</span> start<span class="Delimiter">,</span> <span class="Normal">int</span> length<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L152" class="LineNr">152 </span>  ostringstream tmp<span class="Delimiter">;</span>
<span id="L153" class="LineNr">153 </span>  <span class="Normal">for</span> <span class="Delimiter">(</span><span class="Normal">int</span> curr = start<span class="Delimiter">;</span>  curr &lt; start+length<span class="Delimiter">;</span>  ++curr<span class="Delimiter">)</span>
<span id="L154" class="LineNr">154 </span>  <span class="Conceal">¦</span> tmp &lt;&lt; to_unicode<span class="Delimiter">(</span><span class="Normal">static_cast</span>&lt;<span class="Normal">uint32_t</span>&gt;<span class="Delimiter">(</span><a href='001help.cc.html#L228'>get_or_insert</a><span class="Delimiter">(</span>Memory<span class="Delimiter">,</span> curr<span class="Delimiter">)));</span>
<span id="L155" class="LineNr">155 </span>  <span class="Identifier">return</span> tmp<span class="Delimiter">.</span>str<span class="Delimiter">();</span>
<span id="L156" class="LineNr">156 </span><span class="Delimiter">}</span>
<span id="L157" class="LineNr">157 </span>
<span id="L158" class="LineNr">158 </span><span class="SalientComment">//:: some miscellaneous helpers now that we have text</span>
<span id="L159" class="LineNr">159 </span>
<span id="L160" class="LineNr">160 </span><span class="Comment">//: assert: perform sanity checks at runtime</span>
<span id="L161" class="LineNr">161 </span>
<span id="L162" class="LineNr">162 </span><span class="Delimiter">:(scenario assert)</span>
<span id="L163" class="LineNr">163 </span><span class="Special">% Hide_errors = true;  // '%' lines insert arbitrary C code into tests before calling 'run' with the lines below. Must be immediately after :(scenario) line.</span>
<span id="L164" class="LineNr">164 </span><span class="muRecipe">def</span> <a href='000organization.cc.html#L113'>main</a> [
<span id="L165" class="LineNr">165 </span>  assert <span class="Constant">0</span><span class="Delimiter">,</span> [<span class="Normal">this</span> is an assert in Mu]
<span id="L166" class="LineNr">166 </span>]
<span id="L167" class="LineNr">167 </span><span class="traceContains">+error: this is an assert in Mu</span>
<span id="L168" class="LineNr">168 </span>
<span id="L169" class="LineNr">169 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L170" class="LineNr">170 </span>ASSERT<span class="Delimiter">,</span>
<span id="L171" class="LineNr">171 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L172" class="LineNr">172 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;assert&quot;</span><span class="Delimiter">,</span> ASSERT<span class="Delimiter">);</span>
<span id="L173" class="LineNr">173 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L174" class="LineNr">174 </span><span class="Normal">case</span> ASSERT: <span class="Delimiter">{</span>
<span id="L175" class="LineNr">175 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L141'>SIZE</a><span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">)</span> != <span class="Constant">2</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L176" class="LineNr">176 </span>  <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' takes exactly two ingredients rather than '&quot;</span> &lt;&lt; to_original_string<span class="Delimiter">(</span>inst<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L177" class="LineNr">177 </span>  <span class="Conceal">¦</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L178" class="LineNr">178 </span>  <span class="Delimiter">}</span>
<span id="L179" class="LineNr">179 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_mu_scalar<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L180" class="LineNr">180 </span>  <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' requires a boolean for its first ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L181" class="LineNr">181 </span>  <span class="Conceal">¦</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L182" class="LineNr">182 </span>  <span class="Delimiter">}</span>
<span id="L183" class="LineNr">183 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!is_literal_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">))</span> &amp;&amp; !is_mu_text<span class="Delimiter">(</span>inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span> <span class="Delimiter">{</span>
<span id="L184" class="LineNr">184 </span>  <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <a href='013update_operation.cc.html#L25'>maybe</a><span class="Delimiter">(</span>get<span class="Delimiter">(</span>Recipe<span class="Delimiter">,</span> r<span class="Delimiter">).</span>name<span class="Delimiter">)</span> &lt;&lt; <span class="Constant">&quot;'assert' requires a text as its second ingredient, but got '&quot;</span> &lt;&lt; inst<span class="Delimiter">.</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>original_string &lt;&lt; <span class="Constant">&quot;'</span><span class="cSpecial">\n</span><span class="Constant">&quot;</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L185" class="LineNr">185 </span>  <span class="Conceal">¦</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L186" class="LineNr">186 </span>  <span class="Delimiter">}</span>
<span id="L187" class="LineNr">187 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L188" class="LineNr">188 </span><span class="Delimiter">}</span>
<span id="L189" class="LineNr">189 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L190" class="LineNr">190 </span><span class="Normal">case</span> ASSERT: <span class="Delimiter">{</span>
<span id="L191" class="LineNr">191 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span>!ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> <span class="Delimiter">{</span>
<span id="L192" class="LineNr">192 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span><a href='014literal_string.cc.html#L126'>is_literal_text</a><span class="Delimiter">(</span><a href='026call.cc.html#L85'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">)))</span>
<span id="L193" class="LineNr">193 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <a href='026call.cc.html#L85'>current_instruction</a><span class="Delimiter">().</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>name &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L194" class="LineNr">194 </span>  <span class="Conceal">¦</span> <span class="Normal">else</span>
<span id="L195" class="LineNr">195 </span>  <span class="Conceal">¦</span> <span class="Conceal">¦</span> <a href='003trace.cc.html#L168'>raise</a> &lt;&lt; <a href='038new_text.cc.html#L143'>read_mu_text</a><span class="Delimiter">(</span>ingredients<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">).</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">))</span> &lt;&lt; <span class="cSpecial">'\n'</span> &lt;&lt; <a href='003trace.cc.html#L197'>end</a><span class="Delimiter">();</span>
<span id="L196" class="LineNr">196 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!Hide_errors<span class="Delimiter">)</span> exit<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L197" class="LineNr">197 </span>  <span class="Delimiter">}</span>
<span id="L198" class="LineNr">198 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L199" class="LineNr">199 </span><span class="Delimiter">}</span>
<span id="L200" class="LineNr">200 </span>
<span id="L201" class="LineNr">201 </span><span class="Comment">//: 'cheating' by using the host system</span>
<span id="L202" class="LineNr">202 </span>
<span id="L203" class="LineNr">203 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Declarations&quot;)</span>
<span id="L204" class="LineNr">204 </span>_READ<span class="Delimiter">,</span>
<span id="L205" class="LineNr">205 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Numbers&quot;)</span>
<span id="L206" class="LineNr">206 </span><a href='001help.cc.html#L221'>put</a><span class="Delimiter">(</span>Recipe_ordinal<span class="Delimiter">,</span> <span class="Constant">&quot;$read&quot;</span><span class="Delimiter">,</span> _READ<span class="Delimiter">);</span>
<span id="L207" class="LineNr">207 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Checks&quot;)</span>
<span id="L208" class="LineNr">208 </span><span class="Normal">case</span> _READ: <span class="Delimiter">{</span>
<span id="L209" class="LineNr">209 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L210" class="LineNr">210 </span><span class="Delimiter">}</span>
<span id="L211" class="LineNr">211 </span><span class="Delimiter">:(before &quot;End Primitive Recipe Implementations&quot;)</span>
<span id="L212" class="LineNr">212 </span><span class="Normal">case</span> _READ: <span class="Delimiter">{</span>
<span id="L213" class="LineNr">213 </span>  <a href='038new_text.cc.html#L223'>skip_whitespace</a><span class="Delimiter">(</span>cin<span class="Delimiter">);</span>
<span id="L214" class="LineNr">214 </span>  string result<span class="Delimiter">;</span>
<span id="L215" class="LineNr">215 </span>  <span class="Normal">if</span> <span class="Delimiter">(</span><a href='001help.cc.html#L238'>has_data</a><span class="Delimiter">(</span>cin<span class="Delimiter">))</span>
<span id="L216" class="LineNr">216 </span>  <span class="Conceal">¦</span> cin &gt;&gt; result<span class="Delimiter">;</span>
<span id="L217" class="LineNr">217 </span>  products<span class="Delimiter">.</span>resize<span class="Delimiter">(</span><span class="Constant">1</span><span class="Delimiter">);</span>
<span id="L218" class="LineNr">218 </span>  products<span class="Delimiter">.</span>at<span class="Delimiter">(</span><span class="Constant">0</span><span class="Delimiter">).</span>push_back<span class="Delimiter">(</span><a href='038new_text.cc.html#L38'>new_mu_text</a><span class="Delimiter">(</span>result<span class="Delimiter">));</span>
<span id="L219" class="LineNr">219 </span>  <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L220" class="LineNr">220 </span><span class="Delimiter">}</span>
<span id="L221" class="LineNr">221 </span>
<span id="L222" class="LineNr">222 </span><span class="Delimiter">:(code)</span>
<span id="L223" class="LineNr">223 </span><span class="Normal">void</span> <a href='038new_text.cc.html#L223'>skip_whitespace</a><span class="Delimiter">(</span>istream&amp; in<span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L224" class="LineNr">224 </span>  <span class="Normal">while</span> <span class="Delimiter">(</span><span class="Constant">true</span><span class="Delimiter">)</span> <span class="Delimiter">{</span>
<span id="L225" class="LineNr">225 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>!has_data<span class="Delimiter">(</span>in<span class="Delimiter">))</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L226" class="LineNr">226 </span>  <span class="Conceal">¦</span> <span class="Normal">if</span> <span class="Delimiter">(</span>isspace<span class="Delimiter">(</span>in<span class="Delimiter">.</span>peek<span class="Delimiter">()))</span> in<span class="Delimiter">.</span>get<span class="Delimiter">();</span>
<span id="L227" class="LineNr">227 </span>  <span class="Conceal">¦</span> <span class="Normal">else</span> <span class="Identifier">break</span><span class="Delimiter">;</span>
<span id="L228" class="LineNr">228 </span>  <span class="Delimiter">}</span>
<span id="L229" class="LineNr">229 </span><span class="Delimiter">}</span>
</pre>
</body>
</html>
<!-- vim: set foldmethod=manual : -->