tag:blogger.com,1999:blog-82912792336677223242024-02-19T00:42:11.743-08:00EastBay CodeHausRandom Notes on ProgrammingMark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.comBlogger119125tag:blogger.com,1999:blog-8291279233667722324.post-64708574611838528212023-05-29T18:12:00.007-07:002023-05-30T10:47:39.113-07:00Parsing a Floating Point String<p><span style="font-family: Arial; font-size: 11pt; white-space-collapse: preserve;"><i>or, Regular Expressions for Fun and Profit!</i></span></p><p><span style="font-family: Arial; font-size: 11pt; white-space-collapse: preserve;">Here's a quick note on efficiently traversing and processing a regular expression that doesn't require backtracking. </span><span style="font-family: Arial; font-size: 11pt; white-space-collapse: preserve;">The example regular expression is a typical floating point string with exponential support. The goal is to efficiently parse the string</span></p><span id="docs-internal-guid-03841a4b-7fff-eb4c-ce03-9c3d75ddd8f7"><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">in a single pass</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">looking only one character ahead at any point</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">using no string functions other that to access each individual character</span></p></li></ul></span><span><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Example:</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-indent: 36pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">([-+]?\d+(\.\d*)?)([eE]([-+]?\d+))?</span></p><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Step 1.</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">Break the RE into the set of states it represents, and the possible transitions from each state.</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">For example, at the beginning of the string ("start" state), there are four possible transitions:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">plus sign (e.g. "+123")</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">minus sign (e.g. "-123")</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">digit (e.g. "123")</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">end-of-string (e.g. "")</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">It can help to make a first pass that just identifies the parts of your regular expression</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><a href="https://sketchviz.com/@marhar/6dcd87693b66913de1ddf0eccf951ac8/5296f19fdadcfa5c7126d09eaa5167943036a1ba" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">sketchviz</span></a></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"></p><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://sketchviz.com/@marhar/6dcd87693b66913de1ddf0eccf951ac8/5296f19fdadcfa5c7126d09eaa5167943036a1ba.sketchy.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="93" data-original-width="1210" height="49" src="https://sketchviz.com/@marhar/6dcd87693b66913de1ddf0eccf951ac8/5296f19fdadcfa5c7126d09eaa5167943036a1ba.sketchy.png" width="640" /></a></div></span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><br />and use that to expand to the complete set of states and transitions.<br /><br /><span><a href="https://sketchviz.com/@marhar/058e218e434b8b5e3fb8b0ccf3cbf5e0/9bbf38e294cb5c98116cc42c91bd726cd1fd0c8d" style="text-decoration-line: none;"><span style="color: #1155cc; font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space-collapse: preserve;">sketchviz</span></a></span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><span style="border: none; display: inline-block; height: 651px; overflow: hidden; width: 2048px;"><a href="https://sketchviz.com/@marhar/058e218e434b8b5e3fb8b0ccf3cbf5e0/9bbf38e294cb5c98116cc42c91bd726cd1fd0c8d.sketchy.png" style="clear: left; display: inline; font-size: 11pt; margin-bottom: 1em; margin-right: 1em; text-align: center;"><img border="0" data-original-height="429" data-original-width="1354" height="203" src="https://sketchviz.com/@marhar/058e218e434b8b5e3fb8b0ccf3cbf5e0/9bbf38e294cb5c98116cc42c91bd726cd1fd0c8d.sketchy.png" width="640" /><span style="color: black;"> </span></a></span></span></span></p><div style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;">(pardon the large gap above, blogspot is messing up)</div><h1 style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt; text-align: left;">Step 2</h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><br /></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;">Fill in the actions needed for each state.</p><span><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">At the transition of each state, we may optionally consume one character. For the start state:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">for plus or minus, we consume a character, since it is not necessary in any subsequent states.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">for a digit, we don't consume a character, since we will need that first digit in the "int" state.</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">In each state, we may optionally perform some processing. For example, let us assume we have a variable "sign" which will indicate if the scanned string represents a positive or negative value. We would take these actions:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">in state sign_positive, set sign = 1;</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">in state sign_negative, set sign = -1;</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">In the "int" state, we would add the digit to the variable representing the integer portion of the string:</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">int_val = int_val * 10; // shift left one digit</span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;"><br /></span><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">int_val = int_val + ordinal_value(current digit) // add this digit's value</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">If the next character ever fails to have a transition out of the current state, it represents and error in the source string. You can keep a character count for precise location, and report exactly what the error is.</span></p><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">"+12J5" --> position 3, "character J is not a legal character"</span></p></li></ul><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">In General:</span></p><br /><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">We traverse the state diagram character by character from the input string.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">Each state specifies the exact set of characters that can transition to subsequent states.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">Each transition specifies whether or not to consume a character.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">Each state optionally has processing to extract information from the current character.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">(some constructs require backtracking, which we will ignore here).</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">A character without an outbound edge represents badly formed input.</span></p></li></ul><h2 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 18pt;"><span style="font-family: Arial; font-size: 16pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Example Parsing</span></h2><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">"123": (start) 1 (int) 2 (int) 3 (int) eos (end)</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">"+1.2.3": (start) + (sign_pos) 1 (int) . (dot) e (E) 3 (exp) eos (end)</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">"12345": (start) 1 (int) 2 (int) 3 (int) 4 (int) 1 (int) 6 (int) eos (end)</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">"hello": (start) h (error)</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">"": (start) eos (end)</span></p></li></ul><br /><h1 dir="ltr" style="line-height: 1.38; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-family: Arial; font-size: 20pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 400; vertical-align: baseline; white-space-collapse: preserve;">Example Code</span></h1><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Arial; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">I did this in C (a) to show there's no fancy functionality needed from your language, (b) because that's how I used to do it when I was a compiler writer and this was making me feel nostalgic, and (c) to have some fun by seeing how people will react to a claim where GOTO and case fall-throughs make for clean, easy to follow code. :) [disclaimer: I haven't timed the difference between the case code and the equivalent if code, but from examining the assembler output it looks like the case code is generating the efficient version of a vector table. In either case, since the code is so small and makes no function calls, it's pretty much guaranteed to execute all in cache for both the code and data.]</span></p><br /><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">#include <stdio.h></span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">int parse(char *p) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> printf("%20s -- ", p);</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> char *errm;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> char *p0 = p;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> int mantissa_sign = 1;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> int exponent_sign = 1;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> unsigned long int_part = 0;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> unsigned long frac_part = 0;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> unsigned int scale = 0;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> unsigned long exponent = 0;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> int trailing_zeros = 0;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> errm = "unknown error";</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> switch (*p) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '-':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> mantissa_sign = -1;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">break;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '+':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">break;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '0':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '1':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '2':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '3':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '4':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '5':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '6':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '7':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '8':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '9':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '.':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">break;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 0:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto finished;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> default:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">errm = "unexpected char in mantissa_sign";</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> goto error;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> }</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">int_part:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> switch (*p) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '.':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">break;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '0':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '1':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '2':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '3':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '4':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '5':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '6':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '7':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '8':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '9':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> int_part *= 10;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">int_part += *p - '0';</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto int_part;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 'e':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 'E':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto exponent;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 0:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto finished;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> default:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">errm = "unexpected char in int_part";</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> goto error;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> }</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">frac_part_leading_zero:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> switch (*p) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '0':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> scale += 1;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto frac_part_leading_zero;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '1':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '2':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '3':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '4':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '5':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '6':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '7':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '8':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '9':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto frac_part;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 0:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto finished;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 'e':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 'E':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto exponent;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> default:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">errm = "unexpected char in frac_part_leading_zero";</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> goto error;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> }</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">frac_part:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> switch (*p) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '0':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> trailing_zeros += 1;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> frac_part *= 10;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">frac_part += *p - '0';</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto frac_part;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '1':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '2':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '3':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '4':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '5':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '6':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '7':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '8':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '9':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">trailing_zeros = 0;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> frac_part *= 10;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">frac_part += *p - '0';</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto frac_part;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 'e':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 'E':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto exponent_sign;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 0:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto finished;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> default:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">errm = "unexpected char in frac_part";</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> goto error;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> }</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">exponent_sign:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> switch (*p) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '-':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> exponent_sign = -1;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto exponent;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '+':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto exponent;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '0':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '1':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '2':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '3':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '4':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '5':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '6':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '7':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '8':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '9':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto exponent;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 0:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">errm = "unexpected char in exponent_sign";</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto finished;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> }</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">exponent:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> switch (*p) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '0':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '1':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '2':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '3':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '4':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '5':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '6':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '7':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '8':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case '9':</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> exponent *= 10;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">exponent += *p - '0';</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">p++;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto exponent;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> case 0:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">goto finished;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> default:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"><span class="Apple-tab-span" style="text-wrap: nowrap;"> </span></span><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">errm = "unexpected char in exponent";</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> goto error;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> }</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">finished:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> for (int i = 0; i < trailing_zeros; i++) {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> frac_part = frac_part / 10;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> }</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> printf("signs=%d,%d int=%lu frac=%lu trail=%d scale=%u exp=%lu\n",</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> mantissa_sign, exponent_sign,</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> int_part, frac_part, trailing_zeros, scale, exponent);</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> return 0;</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">error:</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> printf("pos=%ld c=%c,%d error:%s\n", p-p0, *p, *p, errm);</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> return 1;</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">}</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">int main() {</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("+123");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("-123");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("123");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("+123.");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("+123.456");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("-123.456");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("123.456");</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("1e0");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("1e1");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("1E0");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("1E1");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("1.23e10");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("1.23e-10");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("");</span></p><br /><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("123.00456");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;"> parse("123.004560000");</span></p><p dir="ltr" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-family: Inconsolata, monospace; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space-collapse: preserve;">}</span></p><br /></span><div><span><br /></span></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-26805046499114123192023-04-21T17:03:00.007-07:002023-04-21T17:08:18.544-07:00DuckDB ASOF JOIN Example<p><span style="font-family: courier; font-size: 10pt; font-weight: 600; white-space: pre-wrap;">Here's a quick example of duckdb's new ASOF JOIN.</span></p><p><span style="font-family: courier; font-size: 10pt; font-weight: 600; white-space: pre-wrap;">Problem: we have a time-based price table; if you have a sale time that falls in the gaps, you get NULL price and total.</span></p><p><span style="font-family: courier; font-size: 10pt; font-weight: 600; white-space: pre-wrap;">Solution: "ASOF JOIN" picks a good value for "in the gap" sales.</span></p><span id="docs-internal-guid-77cb3480-7fff-9308-b1ad-84a0e3074cb2"><h1 dir="ltr" style="line-height: 1.2; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">Create a price table and sales table.</span></span></h1><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">create table prices as (</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"> SELECT '2001-01-01 00:16:00'::TIMESTAMP + INTERVAL (v) MINUTE AS ticker_time,</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"> v as unit_price</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"> FROM range(0,5) vals(v)</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">);</span></span></p><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">create table sales(item text, sale_time timestamp, quantity int);</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">insert into sales values('a', '2001-01-01 00:18:00', 10);</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">insert into sales values('b', '2001-01-01 00:18:30', 20);</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">insert into sales values('c', '2001-01-01 00:19:00', 30);</span></span></p><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">select * from prices;</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">┌─────────────────────┬────────────┐</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ ticker_time │ unit_price │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ timestamp │ int64 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">├─────────────────────┼────────────┤</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ 2001-01-01 00:16:00 │ 0 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ 2001-01-01 00:17:00 │ 1 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ 2001-01-01 00:18:00 │ 2 │ No unit_price for 18:30!</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ 2001-01-01 00:19:00 │ 3 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ 2001-01-01 00:20:00 │ 4 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">└─────────────────────┴────────────┘</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">select * from sales;</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">┌─────────┬─────────────────────┬──────────┐</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ item │ sale_time │ quantity │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ varchar │ timestamp │ int32 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">├─────────┼─────────────────────┼──────────┤</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ a │ 2001-01-01 00:18:00 │ 10 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ b │ 2001-01-01 00:18:30 │ 20 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ c │ 2001-01-01 00:19:00 │ 30 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">└─────────┴─────────────────────┴──────────┘</span></span></p><h1 dir="ltr" style="line-height: 1.2; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">Normal Left Join, problem for the 18:30 sale!</span></span></h1><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">-- no price value for 18:30, so item b's unit_price and total are NULL!</span></span></p><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">select s.*, p.unit_price, s.quantity * p.unit_price as total</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"> from sales s left join prices p</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"> on s.sale_time = p.ticker_time;</span></span></p><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">┌─────────┬─────────────────────┬──────────┬────────────┬───────┐</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ item │ sale_time │ quantity │ unit_price │ total │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ varchar │ timestamp │ int32 │ int64 │ int64 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">├─────────┼─────────────────────┼──────────┼────────────┼───────┤</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ a │ 2001-01-01 00:18:00 │ 10 │ 2 │ 20 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ c │ 2001-01-01 00:19:00 │ 30 │ 3 │ 90 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="background-color: #351c75; font-family: courier;">│ b │ 2001-01-01 00:18:30 │ 20 │ NULL │ NULL │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">└─────────┴─────────────────────┴──────────┴────────────┴───────┘</span></span></p><h1 dir="ltr" style="line-height: 1.2; margin-bottom: 6pt; margin-top: 20pt;"><span style="font-size: 14pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-decoration-line: underline; text-decoration-skip-ink: none; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">ASOF Join, picks a good price for the 18:30 sale!</span></span></h1><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">-- using asof, 18:30 "rounds down" to use the 18:00 unit_price</span></span></p><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">select s.*, p.unit_price, s.quantity * p.unit_price as total_cost</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"> from sales s <span style="background-color: #351c75;">asof left join</span> prices p</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;"> on s.sale_time >= p.ticker_time;</span></span></p><span style="font-family: courier;"><br /></span><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">┌─────────┬─────────────────────┬──────────┬────────────┬────────────┐</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ item │ sale_time │ quantity │ unit_price │ total_cost │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ varchar │ timestamp │ int32 │ int64 │ int64 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">├─────────┼─────────────────────┼──────────┼────────────┼────────────┤</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ a │ 2001-01-01 00:18:00 │ 10 │ 2 │ 20 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="background-color: #351c75; font-family: courier;">│ b │ 2001-01-01 00:18:30 │ 20 │ 2 │ 40 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">│ c │ 2001-01-01 00:19:00 │ 30 │ 3 │ 90 │</span></span></p><p dir="ltr" style="line-height: 1.2; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 10pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; font-weight: 600; vertical-align: baseline; white-space: pre-wrap;"><span style="font-family: courier;">└─────────┴─────────────────────┴──────────┴────────────┴────────────┘</span></span></p><br /></span>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-65872909495083734492023-04-21T12:02:00.001-07:002023-04-21T12:19:05.505-07:00Duckdb Full Text Search ExampleI learned a lot from Laurens Kuiper's blog post <a href="https://duckdb.org/2021/01/25/full-text-search.html">Testing out DuckDB's Full Text Search Extension</a>, but unfortunately couldn't find the data set he was using for testing.<div><br /></div><div>So, here's a simple "hello world" example using the easily accessible (and parsable!) kjv.txt. Note that everything past the table creation can be done in the duckdb cli.</div><div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div><div><span style="font-family: courier; font-size: x-small;">% cat duckdb-full-text-search.py </span></div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div><div><span style="font-family: courier; font-size: x-small;">import re</span></div><div><span style="font-family: courier; font-size: x-small;">import duckdb</span></div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div><div><span style="font-family: courier; font-size: x-small;"># -------- prepare the data -----------</span></div><div><span style="font-family: courier; font-size: x-small;">fd = open('kjv.txt') # https://www.o-bible.com/download/kjv.txt</span></div><div><span style="font-family: courier; font-size: x-small;">fd.readline() # skip first line</span></div><div><span style="font-family: courier; font-size: x-small;">data = []</span></div><div><span style="font-family: courier; font-size: x-small;">for line in fd.readlines():</span></div><div><span style="font-family: courier; font-size: x-small;"> line = line.rstrip()</span></div><div><span style="font-family: courier; font-size: x-small;"> # book, chap, verse, body = re.match(r'(\d?[A-Za-z]+)(\d+):(\d+)\s+(.*)', line).groups()</span></div><div><span style="font-family: courier; font-size: x-small;"> ref, body = re.match(r'(\d?[A-Za-z]+\d+:\d+)\s+(.*)', line).groups()</span></div><div><span style="font-family: courier; font-size: x-small;"> data.append((ref,body,))</span></div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div><div><span style="font-family: courier; font-size: x-small;"># -------- create the table -----------</span></div><div><span style="font-family: courier; font-size: x-small;">db = duckdb.connect()</span></div><div><span style="font-family: courier; font-size: x-small;">db.cursor().execute("create table corpus(ref text, body text)")</span></div><div><span style="font-family: courier; font-size: x-small;">db.cursor().executemany("insert into corpus(ref, body) values($1, $2)", data)</span></div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div><div><span style="font-family: courier; font-size: x-small;"># -------- everything below could be run in the duckdb cli ---------</span></div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div><div><span style="font-family: courier; font-size: x-small;"># -------- create the index -----------</span></div><div><span style="font-family: courier; font-size: x-small;">db.cursor().execute(</span></div><div><span style="font-family: courier; font-size: x-small;"> """</span></div><div><span style="font-family: courier; font-size: x-small;"> install 'fts';</span></div><div><span style="font-family: courier; font-size: x-small;"> load fts;</span></div><div><span style="font-family: courier; font-size: x-small;"> pragma create_fts_index('corpus', 'ref', 'ref', 'body');</span></div><div><span style="font-family: courier; font-size: x-small;"> """)</span></div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div><div><span style="font-family: courier; font-size: x-small;"># -------- full text query -----------</span></div><div><span style="font-family: courier; font-size: x-small;">print(db.sql("""</span></div><div><span style="font-family: courier; font-size: x-small;"> select fts_main_corpus.match_bm25(ref, 'whale') as score,</span></div><div><span style="font-family: courier; font-size: x-small;"> ref, body as "search for 'whale'"</span></div><div><span style="font-family: courier; font-size: x-small;"> from corpus</span></div><div><span style="font-family: courier; font-size: x-small;"> where score is not null</span></div><div><span style="font-family: courier; font-size: x-small;"> order by score;</span></div><div><span style="font-family: courier; font-size: x-small;"> """))</span></div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div><div><div><span style="font-family: courier; font-size: x-small;">% python3 ./duckdb-full-text-search.py</span></div><div><span style="font-family: courier; font-size: x-small;">┌───────────────────┬──────────┬───────────────────────────────────────────────┐</span></div><div><span style="font-family: courier; font-size: x-small;">│ score │ ref │ search for 'whale' │</span></div><div><span style="font-family: courier; font-size: x-small;">│ double │ varchar │ varchar │</span></div><div><span style="font-family: courier; font-size: x-small;">├───────────────────┼──────────┼───────────────────────────────────────────────┤</span></div><div><span style="font-family: courier; font-size: x-small;">│ 2.7248255618541 │ Eze32:2 │ Son of man, take up a lamentation for Phara… │</span></div><div><span style="font-family: courier; font-size: x-small;">│ 3.839526928067141 │ Ge1:21 │ And God created great whales, and every liv… │</span></div><div><span style="font-family: courier; font-size: x-small;">│ 3.839526928067141 │ Mat12:40 │ For as Jonas was three days and three night… │</span></div><div><span style="font-family: courier; font-size: x-small;">│ 6.497660955190547 │ Job7:12 │ Am I a sea, or a whale, that thou settest a… │</span></div><div><span style="font-family: courier; font-size: x-small;">└───────────────────┴──────────┴───────────────────────────────────────────────┘</span></div></div><div><span style="font-family: courier; font-size: x-small;"><br /></span></div></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-18146232078604060352022-10-30T12:18:00.002-07:002022-10-30T12:24:25.131-07:00Everything you need to know about Python Magic<p><br /></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">### Most built-in operations resolve to calling the "double underline" functions.</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">### -----------------------------------------------------------------------------</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> x=3</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br /></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> type(x)</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><class 'int'></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;">>>> dir(x)</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute__', '__getnewargs__', '__gt__', '__hash__', '__index__', '__init__', '__init_subclass__', '__int__', '__invert__', '__le__', '__lshift__', '__lt__', '__mod__', '__mul__', '__ne__', '__neg__', '__new__', '__or__', '__pos__', '__pow__', '__radd__', '__rand__', '__rdivmod__', '__reduce__', '__reduce_ex__', '__repr__', '__rfloordiv__', '__rlshift__', '__rmod__', '__rmul__', '__ror__', '__round__', '__rpow__', '__rrshift__', '__rshift__', '__rsub__', '__rtruediv__', '__rxor__', '__setattr__', '__sizeof__', '__str__', '__sub__', '__subclasshook__', '__truediv__', '__trunc__', '__xor__', 'as_integer_ratio', 'bit_length', 'conjugate', 'denominator', 'from_bytes', 'imag', 'numerator', 'real', 'to_bytes']</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br /></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br /></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">### equal-to and less-than using the syntax and the Magic</p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;">### -----------------------------------------------------</p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br /></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;">>>> print(x==4, x < 4)</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">False True</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br /></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> print(x.__eq__(4), x.__lt__(4))</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">False True</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">### The magic behind iterators</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">### --------------------------</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;">>>> x=[1,2,3]</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> type(x)</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><class 'list'></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> dir(x)</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">['__add__', '__class__', '__contains__', '__delattr__', '__delitem__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__iadd__', '__imul__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__rmul__', '__setattr__', '__setitem__', '__sizeof__', '__str__', '__subclasshook__', 'append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">### Iterate using the syntax</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">### ------------------------</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span style="font-variant-ligatures: no-common-ligatures;">>>> for i in x: print(i)</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">...<span class="Apple-converted-space"> </span></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">1</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">2</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">3</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">### Iterate using the Magic</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">### -----------------------</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> it = x.__iter__()</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> type(it)</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><class 'list_iterator'></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> dir(it)</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__length_hint__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__setstate__', '__sizeof__', '__str__', '__subclasshook__']</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><br /></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><br /></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> it.__next__()</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">1</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> it.__next__()</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">2</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> it.__next__()</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">3</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>> it.__next__()</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">Traceback (most recent call last):</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"><span class="Apple-converted-space"> </span>File "<stdin>", line 1, in <module></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">StopIteration</span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;"></span></p><p class="p1" style="background-color: black; color: lime; font-family: "Comic Mono"; font-size: 12px; font-stretch: normal; font-variant-east-asian: normal; font-variant-numeric: normal; line-height: normal; margin: 0px;"><span class="s1" style="font-variant-ligatures: no-common-ligatures;">>>><span class="Apple-converted-space"> </span></span></p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-80356911762642039052022-08-15T23:55:00.000-07:002022-08-15T23:55:18.227-07:00Collection: Docker etc<p> Docker</p><p></p><ul style="text-align: left;"><li><a href="https://blog.gruntwork.io/the-docker-kubernetes-terraform-and-aws-crash-course-series-dca343ba1274">The Docker, Kubernetes, Terraform, and AWS crash course series | by Yevgeniy Brikman | Jul, 2022 | Gruntwork</a></li><li><br /></li></ul><p></p><p>Kube</p><p></p><ul style="text-align: left;"><li><a href="https://freeman.vc/notes/falling-for-kubernetes">Falling for Kubernetes | Pierce Freeman</a></li><li><br /></li><li><br /></li></ul><p></p><p><br /></p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-30802404122631584732022-08-15T23:38:00.000-07:002022-08-15T23:38:57.347-07:00Collection: Security<h3 style="text-align: left;"> Notes</h3><div><ul style="text-align: left;"><li><a href="https://www.nccoe.nist.gov/projects/implementing-zero-trust-architecture">Implementing a Zero Trust Architecture | NCCoE</a></li><li><a href="https://tls13.xargs.org/">The Illustrated TLS 1.3 Connection: Every Byte Explained</a></li><li><br /></li><li><br /></li><li><br /></li><li><br /></li><li><br /></li><li><br /></li><li><br /></li></ul></div><div><br /></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-85296410847186291802022-08-15T23:17:00.001-07:002022-08-15T23:17:48.558-07:00Collection: Postgresql<h4 style="text-align: left;"> Notes:</h4><div><ul style="text-align: left;"><li><a href="https://www.postgresql.org/docs/current/ssl-tcp.html">PostgreSQL: Documentation: 14: 19.9. Secure TCP/IP Connections with SSL</a></li><li><a href="https://www.jetbrains.com/help/go/connect-to-a-database.html">How to run PostgreSQL queries from GoLand | GoLand</a></li><li><a href="https://dbconvert.com/blog/postgresql-change-data-capture-cdc/">PostgreSQL Change data capture (CDC) + golang sample code.</a></li><li><a href="https://docs.aws.amazon.com/dms/latest/userguide/CHAP_Source.PostgreSQL.html">Using a PostgreSQL database as an AWS DMS source - AWS Database Migration Service</a></li></ul></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-31449138804114995482022-08-15T23:01:00.002-07:002022-08-15T23:24:38.512-07:00Collection: Git<h3 style="text-align: left;"> Git Notes</h3><div><ul style="text-align: left;"><li><a href="https://jwiegley.github.io/git-from-the-bottom-up/">Git from the Bottom Up</a></li><li><a href="https://perl.plover.com/classes/git-tips/">Things I think everyone should know about Git</a></li><li><a href="https://blog.plover.com/prog/git/tips-2.html">The Universe of Discourse : Things I wish everyone knew about Git (Part II)</a></li><li><br /></li><li><a href="https://benjamincongdon.me/blog/2022/07/17/In-Praise-of-Stacked-PRs/">In Praise of Stacked PRs | Ben Congdon</a></li><li><a href="https://dxuuu.xyz/prr.html">Pull request review (prr)</a></li><li><br /></li><li><br /></li></ul></div><div><br /></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-13658843578174117852022-08-15T22:56:00.006-07:002022-08-15T22:56:58.997-07:00Collection: Dall-e<p></p><h3 style="text-align: left;">Dall-e Notes</h3><ul style="text-align: left;"><li> <a href="https://pub.towardsai.net/i-spent-15-in-dall-e-2-credits-creating-this-ai-image-and-heres-what-i-learned-52f352912025">I spent $15 in DALL·E 2 credits creating this AI image, and here’s what I learned | by Joy Zhang | Aug, 2022 | Towards AI</a></li><li><a href="https://medium.com/@glan1k/dall-e-gpt-3-d1aaaff38639">DALL-E + GPT-3 = ❤️. Update: Follow up article by… | by glan1k | Aug, 2022 | Medium</a></li><li><a href="https://deephaven.io/blog/2022/08/08/AI-generated-blog-thumbnails/">I replaced all our blog thumbnails using DALL·E 2 for $45: here’s what I learned | Deephaven</a></li><li><a href="https://jacobmartins.com/posts/how-i-used-dalle2-to-generate-the-logo-for-octosql/">How I Used DALL·E 2 to Generate The Logo for OctoSQL | Jacob Martin</a></li><li><a href="https://dallery.gallery/the-dalle-2-prompt-book/">The DALL·E 2 Prompt Book – DALL·Ery GALL·Ery</a></li></ul><p></p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-64383063572719643642022-05-28T22:19:00.009-07:002022-05-28T22:19:56.111-07:00gRPC Stuff<p><a href="https://grpc.io/docs/protoc-installation/">https://grpc.io/docs/protoc-installation/</a><br />brew install protobuf</p><p><a href="https://grpc.io/docs/languages/go/quickstart/">https://grpc.io/docs/languages/go/quickstart/</a><br />go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28<br />go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2</p><div>example code:</div>git clone -b v1.46.0 --depth 1 https://github.com/grpc/grpc-go<div><p><a href="https://github.com/fullstorydev/grpcurl">https://github.com/fullstorydev/grpcurl</a><br />go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest</p></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-20082276410894853412022-05-23T11:59:00.005-07:002022-05-28T22:30:06.737-07:00Notes from gittower "Undoing Git Mistakes" presentation<h2 style="text-align: left;">Uncommited Local Changes</h2><p style="text-align: left;">1. revert local changes<br />git restore fname</p><p style="text-align: left;">2. accidentally deleted a file<br />git restore fname</p><p style="text-align: left;">3. discarding chunks/lines (-p = patch)<br /># interactive, y/n for discard<br />git restore -p fname</p><p style="text-align: left;">4. discard all local changes<br />git restore .</p>(git stash)<br /><h4 style="text-align: left;">Looking at committed history !! never change history that has been pushed</h4><div style="text-align: left;">feature branch before adding to a team branch</div><br />5. fixing last commit message<br />git commit --amend -m "better commit message"<br /><br />6. adding file to commit<br />git commit --amend (used tower to add file)<br /><br />7. reverting a commit in the middle (c1, c2, c3; c2 is bad)<br />git revert bad-commit-hash<br /><br />8. resetting to an old revision (everything after c2 is bad)<br />git reset --hard good-commit-hash<br />(--hard and --mixed are all you need; --mixed keeps changes as local changes)<br /><br />9. resetting a file to an old revision<br />## returns to prior state for a specific file<br />git restore --source good-hash fname<br /><br />## reflog -- journal of head pointer changes<br /><br />10. recover a deleted revision<br />git reflog<br />-- sorted chronologically<br />-- get accidentally deleted<br />git branch happy-ending previous-state<br /><br />11. recovering a deleted branch<br />git reflog (note we had to switch away from branch)<br />git branch feature/login earlier-hash<br /><br />12. moving a commit to a new branch<br />-- supposed committed to master instead of feature branch<br />-- we see most recent commit on master<br />(drag commit from master to feature branch; delete commit on master)<br />git branch feature/login<br />git reset HEAD~1 --hard<br /><br />13. moving a commit to a different branch (which exists)<br />-- use cherry pick to move commit to correct branch<br />-- clean up master<br />git checkout feature/newsletter<br />git cherry-pick sha<br />git checkout master<br />git reset --hard HEAD~1<br /><h4 style="text-align: left;">interactive rebase (use for only local history!!!)</h4>14. edit old commit<br />git rebase -i HEAD~3<br />-- commits in reverse order<br />-- go to parent commit of commit you want to change<br />action keyword: reword<br />-- git opens editor for commit message<br /><br />15. delete old commits<br />git rebase -i HEAD~2 (or copy commit hash)<br />action keyword: drop<br /><br />16. squashing multiple commits into one<br />git rebase -i HEAD~3<br />action keyword: squash<br />-- line marked squash is combined with line above<br />-- get edit for this squashing commit<br /><br />17. adding a change (file) to an old commit<br />-- c4 has fix for c2<br />-- c4 is good<br />-- two steps: use fixup to commit, rebase autosquash<br />git add missing-file<br />git commit --fixup broken-hash<br />git rebase -i HEAD~4 --autosquash<br />-- changes order of bandaid commit<br /><br />18. splitting/editing old commit<br />(in gui)<br /><br />git-tower.com/learn<br />git-tower.com/help<br />Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-27488767032347557362022-05-23T10:12:00.007-07:002022-06-12T21:12:00.397-07:00Go Vim notes<span style="font-family: courier; font-size: x-small;"><div style="font-family: Times; font-size: medium;"><span style="font-family: courier; font-size: x-small;"># install ycm</span></div><div style="font-family: Times; font-size: medium;"><span style="font-family: courier; font-size: x-small;"><br /></span></div><div style="font-family: Times; font-size: medium;"><span style="font-family: courier; font-size: x-small;">linux:</span></div><div style="font-family: Times; font-size: medium;"><span style="font-family: courier; font-size: x-small;"><div>$ sudo apt install vim-youcompleteme</div><div>$ vim-addon-manager install youcompleteme</div></span></div><div style="font-family: Times; font-size: medium;"><span style="font-family: courier; font-size: x-small;"><br /></span></div><span style="font-family: courier; font-size: x-small;"><span style="font-family: courier; font-size: x-small;">mac:<br />% brew install youcompleteme</span></span></span><div><span style="font-family: courier; font-size: x-small;"><span style="font-family: courier; font-size: x-small;">maybe:<br />% cd .vim/bundle/youcompleteme</span><div style="font-family: Times; font-size: medium;"><span style="font-family: courier; font-size: x-small;">% python3 ~/.vim/bundle/youcompleteme/third_party/ycmd/build.py --all --verbose</span></div><div style="font-family: Times; font-size: medium;"><span style="font-family: courier; font-size: x-small;"><span style="font-family: courier; font-size: x-small;"> (or just </span><span style="font-family: courier; font-size: x-small;">--go-completer)</span></span></div><div style="font-family: Times; font-size: medium;"><br /></div><div style="font-family: Times; font-size: medium;"><span style="font-family: courier; font-size: small;"># install vundle</span></div></span></div><div><span style="font-family: courier; font-size: x-small;">% git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim<br /><br />% cat .vimrc <br />set nocompatible " be iMproved, required<br />filetype off " required<br />set rtp+=~/.vim/bundle/Vundle.vim<br />call vundle#begin()<br />Plugin 'VundleVim/Vundle.vim'<br />Plugin 'valloric/youcompleteme'<br />Plugin 'fatih/vim-go'<br />call vundle#end() " required<br />filetype plugin indent on " required<br /></span><span style="font-family: courier; font-size: x-small;"><br /></span><div><div><span style="font-family: courier; font-size: x-small;">% vim</span></div><div><span style="font-family: courier; font-size: x-small;">:PluginInstall</span></div><div><span style="font-family: courier; font-size: x-small;">:GoInstallBinaries</span><br /></div></div></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-90294118159065211182022-05-21T15:25:00.002-07:002022-05-21T15:25:55.470-07:00Bud - RoR for Go?<p><a href="https://github.com/livebud/bud">https://github.com/livebud/bud</a></p><p><a href="https://denim-cub-301.notion.site/Hey-Bud-4d81622cc49942f9917c5033e5205c69">https://denim-cub-301.notion.site/Hey-Bud-4d81622cc49942f9917c5033e5205c69</a></p><p>Bud is a full-stack framework that helps you build web applications faster. You can think of Bud as the Ruby on Rails for the Go ecosystem.</p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-7063034872708896112022-05-21T15:22:00.003-07:002022-05-21T15:22:32.822-07:00I'm All-In on Server-Side SQLite<p><a href="https://fly.io/blog/all-in-on-sqlite-litestream/">https://fly.io/blog/all-in-on-sqlite-litestream/</a></p>How Litestream works is that it takes control of SQLite's <a href="https://sqlite.org/wal.html">WAL-mode journaling</a>. In WAL mode, write operations append to a log file stored alongside SQLite's main database file. Readers check both the WAL file and the main database to satisfy queries. Normally, SQLite automatically checkpoints pages from the WAL back to the main database. Litestream steps in the middle of this: we open an indefinite read transaction that prevents automatic checkpoints. We then capture WAL updates ourselves, replicate them, and trigger the checkpointing ourselves.<br />Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-37357740892513945532022-05-21T15:18:00.000-07:002022-05-21T15:18:48.902-07:00JSON and virtual columns in SQLite<p><a href="https://antonz.org/json-virtual-columns/">https://antonz.org/json-virtual-columns/</a></p><a href="https://antonz.org/generated-columns/">Generated columns</a> have another great use case.<div><br /></div><div>tldr: index your generated columns, just as good as a nosql db!<br /><div><br /></div><div><pre style="background-attachment: initial !important; background-clip: initial !important; background-color: white; background-image: initial !important; background-origin: initial !important; background-position: initial !important; background-repeat: initial !important; background-size: initial !important; box-sizing: inherit; font-family: var(--font-monospace); line-height: 1; margin-bottom: 0.8em; margin-top: 0px; overflow-x: auto; padding: 1em 1.5em; tab-size: 4;" tabindex="0"><code class="language-sql" data-lang="sql" style="box-sizing: inherit; font-family: var(--font-monospace);"><span style="box-sizing: inherit; color: #a90d91; font-size: 15.36px;">alter</span><span style="font-size: 15.36px;"> </span><span style="box-sizing: inherit; color: #a90d91; font-size: 15.36px;">table</span><span style="font-size: 15.36px;"> </span><span style="box-sizing: inherit; font-size: 15.36px;">events</span><span style="font-size: 15.36px;">
</span><span style="box-sizing: inherit; color: #a90d91; font-size: 15.36px;">add</span><span style="font-size: 15.36px;"> </span><span style="box-sizing: inherit; color: #a90d91; font-size: 15.36px;">column</span><span style="font-size: 15.36px;"> </span><span style="box-sizing: inherit; font-size: 15.36px;">object_id</span><span style="font-size: 15.36px;"> </span><span style="box-sizing: inherit; color: #a90d91; font-size: 15.36px;">integer</span><span style="font-size: 15.36px;">
</span><span style="box-sizing: inherit; color: #a90d91; font-size: 15.36px;">as</span><span style="font-size: 15.36px;"> (</span><span style="box-sizing: inherit; font-size: 15.36px;">json_extract</span><span style="font-size: 15.36px;">(</span><span style="box-sizing: inherit; font-size: 15.36px;">value</span><span style="font-size: 15.36px;">, </span><span style="box-sizing: inherit; color: #c41a16; font-size: 15.36px;">'$.object_id'</span><span style="font-size: 15.36px;">));
</span></code><span style="font-size: 15.36px;">
</span>create<span style="font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;"> </span><span style="box-sizing: inherit; color: #a90d91; font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;">index</span><span style="font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;"> </span><span style="box-sizing: inherit; font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;">events_object_id</span><span style="font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;"> </span><span style="box-sizing: inherit; color: #a90d91; font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;">on</span><span style="font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;"> </span><span style="box-sizing: inherit; font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;">events</span><span style="font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;">(</span><span style="box-sizing: inherit; font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;">object_id</span><span style="font-family: var(--font-monospace); font-size: 15.36px; white-space: normal;">)</span></pre></div></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-76148498760865145492022-05-21T15:07:00.002-07:002022-05-21T15:12:59.987-07:00TimescaleDB<p><a href="https://docs.timescale.com/timescaledb/latest/#welcome-to-the-timescaledb-documentation">https://docs.timescale.com/timescaledb/latest/#welcome-to-the-timescaledb-documentation</a></p><p>TimescaleDB is a time-series database, built on top of PostgreSQL. More than that, however, it's a relational database for time-series. Developers who use TimescaleDB get the benefit of a purpose-built time-series database, plus a classic relational database (PostgreSQL), all in one, with full SQL support.</p><p><a href="https://docs.timescale.com/timescaledb/latest/overview/how-does-it-compare/timescaledb-vs-postgres/#why-use-timescaledb-over-relational-databases">https://docs.timescale.com/timescaledb/latest/overview/how-does-it-compare/timescaledb-vs-postgres/#why-use-timescaledb-over-relational-databases</a></p><p>TimescaleDB also includes a number of time-oriented features that aren't found in traditional relational databases. These include special query optimizations (like the merge append above) that provide some of the huge performance improvements for time-oriented queries, as well as other time-oriented functions (some of which are listed below).</p><p><a href="https://www.timescale.com/blog/observability-powered-by-sql-understand-your-systems-like-never-before-with-opentelemetry-traces-and-postgresql/">https://www.timescale.com/blog/observability-powered-by-sql-understand-your-systems-like-never-before-with-opentelemetry-traces-and-postgresql/</a></p><p>Today, we are announcing the general availability of OpenTelemetry tracing support in Promscale, the observability backend for metrics and traces built on the rock-solid foundations of PostgreSQL and TimescaleDB. We’re now closer to becoming the unified data store for observability powered by SQL, bringing the PostgreSQL and observability worlds together.</p><div><br /></div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-67150687693036121722020-10-19T08:25:00.002-07:002020-10-19T08:25:17.740-07:00Golang Calling Stack<p> </p><div class="moz-text-html" lang="x-unicode"><div dir="ltr"><div>package main</div><div><br /></div><div>import (</div><div><span style="white-space: pre;"> </span>"fmt"</div><div><span style="white-space: pre;"> </span>"runtime"</div><div>)</div><div><br /></div><div>func main() {</div><div><span style="white-space: pre;"> </span>aa()</div><div>}</div><div><br /></div><div>func aa() {</div><div><span style="white-space: pre;"> </span>bb()</div><div>}</div><div><br /></div><div>func bb() {</div><div><span style="white-space: pre;"> </span>cc("hello")</div><div>}</div><div><br /></div><div>func cc0(s string) {</div><div><span style="white-space: pre;"> </span>callers := make([]uintptr, 8)</div><div><span style="white-space: pre;"> </span>runtime.Callers(1, callers)</div><div><span style="white-space: pre;"> </span>frames := runtime.CallersFrames(callers)</div><div><span style="white-space: pre;"> </span>for {</div><div><span style="white-space: pre;"> </span>f, ok := frames.Next()</div><div><span style="white-space: pre;"> </span>if !ok {</div><div><span style="white-space: pre;"> </span>break</div><div><span style="white-space: pre;"> </span>}</div><div><span style="white-space: pre;"> </span>fmt.Println("--")</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f)</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f.Entry)</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f.File)</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f.Func)</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f.Function)</div><div><span style="white-space: pre;"> </span>}</div><div>}</div><div><br /></div><div>func cc(s string) {</div><div><span style="white-space: pre;"> </span>callers := make([]uintptr, 8)</div><div><span style="white-space: pre;"> </span>runtime.Callers(1, callers)</div><div><span style="white-space: pre;"> </span>frames := runtime.CallersFrames(callers)</div><div><span style="white-space: pre;"> </span>f, _ := frames.Next()</div><div><span style="white-space: pre;"> </span>fmt.Println("--")</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f)</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f.Entry)</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f.File)</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f.Func)</div><div><span style="white-space: pre;"> </span>fmt.Println("f: ", f.Function)</div><div>}</div><div><br /></div></div>
</div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-17043267658792332042020-10-19T08:24:00.004-07:002020-10-19T08:24:49.790-07:00Python Multiprocessing Snippet<p> You can use a pool of worker processes and a Manager
instance to manage access to tf_dict and df_dict dictionaries which are
shared between workers:</p><div dir="auto"><br /></div><div dir="auto">import glob</div><div dir="auto">import multiprocessing as mp</div><div dir="auto"><br /></div><div dir="auto">from utils import get_tokens, update_tf, update_df, save_dicts</div><div dir="auto"><br /></div><div dir="auto">WORKERS = 4</div><div dir="auto"><br /></div><div dir="auto">def update_dicts(filename, tf_dict, df_dict):</div><div dir="auto"> tokens = get_tokens(filename)</div><div dir="auto"><br /></div><div dir="auto"> for tok in tokens:</div><div dir="auto"> update_tf(tok, tf_dict)</div><div dir="auto"> update_df(tok, df_dict)</div><div dir="auto"><br /></div><div dir="auto">def main():</div><div dir="auto"> manager = mp.Manager()</div><div dir="auto"><br /></div><div dir="auto"> tf_dict = manager.dict()</div><div dir="auto"> df_dict = manager.dict()</div><div dir="auto"><br /></div><div dir="auto"> pool = mp.Pool(WORKERS)</div><div dir="auto"><br /></div><div dir="auto"> for filename in glob.glob('/path/to/texts/*.txt'):</div><div dir="auto"> pool.apply_async(update_dicts, args=(filename, tf_dict, df_dict))</div><div dir="auto"><br /></div><div dir="auto"> pool.close()</div><div dir="auto"> pool.join()</div><div dir="auto"><br /></div><div dir="auto"> save_dicts(tf_dict, df_dict)</div><div dir="auto"><br /></div><div dir="auto">if __name__ == "__main__":</div><div dir="auto"> main()</div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-29159422281117973792020-10-19T08:22:00.001-07:002020-10-19T08:22:17.923-07:00Cheap-n-Easy Enhanced Onesheet<p> </p><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWET-kKUwAz7RLVM7dxR-1V1kj_wUH28NMOs79V4dQp619te2ZduDlDZlG1viFhPgTdaO_ink3YI8Boa3mWsDHR-ixGdPcryQI8ds0enYCSh44OZnulzqGEmmgIKB_B8DOxrRZN2HIWRa/s864/cheapneasy-onesheet.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="864" data-original-width="754" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgFWET-kKUwAz7RLVM7dxR-1V1kj_wUH28NMOs79V4dQp619te2ZduDlDZlG1viFhPgTdaO_ink3YI8Boa3mWsDHR-ixGdPcryQI8ds0enYCSh44OZnulzqGEmmgIKB_B8DOxrRZN2HIWRa/s320/cheapneasy-onesheet.png" /></a></div><br /><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><br /><p></p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-40123463109533876732020-10-19T08:19:00.002-07:002020-10-19T08:19:14.433-07:00Uploading ATMEGA328 Bootloader<p> <a href="https://www.theengineeringprojects.com/2015/10/upload-bootloader-atmega328.html">https://www.theengineeringprojects.com/2015/10/upload-bootloader-atmega328.html</a></p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-41276940332001685082020-10-19T08:07:00.008-07:002021-03-12T21:18:52.956-08:00QMK / Drop Notes<div style="text-align: left;"><b>steps</b></div><p><span style="font-family: Inconsolata; font-size: x-small;">cd ~/qmk_firmware; qmk compile<br />Fn-B, bootloader mode<br />cd ~/mdloader; /mdloader_mac --restart -f -D ../qmk_firmware/massdrop_ctrl_marhar.bin </span></p><p><b>refs</b></p><p>https://drop.com/talk/9382/how-to-configure-your-ctrl-keyboard</p><p>https://drop.com/mechanical-keyboards/configurator/config/16042</p><p>https://github.com/qmk/qmk_firmware</p><p>https://github.com/Massdrop/mdloader/releases/tag/1.0.4</p><p>https://github.com/qmk/qmk_firmware</p><p>https://github.com/Massdrop/mdloader</p><p>https://www.storyspooler.com/using-qmk-for-lights-on-massdrop-ctrl/</p><p>https://www.reviewgeek.com/19076/drop-alt-has-everything-you-want-in-a-custom-keyboard-except-the-soldering/</p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-72033742691686967922020-10-18T20:48:00.004-07:002020-10-18T20:48:14.480-07:00Home network speed over my career<p> </p><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><br /></div><br /><img alt="image.png" height="460" shrinktofit="true" src="data:image/png;base64,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" width="542" /><p></p><p><br /></p><p><br /></p><p><br /></p><p><br /></p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-7481202966887858762020-10-18T20:46:00.003-07:002020-10-18T20:46:23.343-07:00Two nice articles on database keys and joining<p> <a class="moz-txt-link-freetext" href="https://codehaus.blogspot.com/2017/05/key-primary-and-foreign.html">https://codehaus.blogspot.com/2017/05/key-primary-and-foreign.html</a></p><p><a class="moz-txt-link-freetext" href="https://stackoverflow.com/questions/38549/what-is-the-difference-between-inner-join-and-outer-join/38578#38578">https://stackoverflow.com/questions/38549/what-is-the-difference-between-inner-join-and-outer-join/38578#38578</a></p>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-65142035996914212592020-10-18T20:34:00.003-07:002020-10-18T20:34:44.478-07:00A nice terminfo definition<p>TERM=xterm-256color infocmp >~/.terminfo/mhterm.terminfo</p><div class="moz-text-html" lang="x-unicode"><div dir="ltr"><div><br /></div><div># 1. change name to mhterm</div><div># 2. get rid of rmcup</div><div># 3. get rid of smcup</div><div><br /></div><div>TERM=xterm-256color infocmp |</div><div> sed \</div><div> -e 's/^#.*Reconstructed.*$/# xterm customized by marhar/' \</div><div> -e 's/^xterm-256color.*$/mhterm|marhar customized xterm,/' \</div><div> -e 's/rmcup[^,]*,//' \</div><div> -e 's/smcup[^,]*,//' \</div><div> >~/.terminfo/mhterm.terminfo</div><div><br /></div><div>tic ~/.terminfo/mhterm.terminfo</div><div><br /></div><div>export TERM=mhterm</div><div><br /></div></div>
</div>Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0tag:blogger.com,1999:blog-8291279233667722324.post-32315454712140094132020-10-14T15:21:00.000-07:002020-10-14T15:21:00.709-07:00BluBaby Wing Fabrication<p>Tony65x55 talks about BluBaby Wings:</p><p>A very short tutorial as to how to cold roll a Blu-Baby wing has been added to here:</p><p><a href="https://www.rcgroups.com/forums/showpost.php?p=7408431&postcount=1">https://www.rcgroups.com/forums/show...31&postcount=1</a></p><p>If you are unsure of the forming process this will amaze you. It's pretty easy.</p><p>Pic 1. After rolling the airfoil, flatten it a bit so the camber is the same for both. Make sure they mate together nice and straight. Block up the tips and you'll see where material has to be removed in order to mate them after the dihedral has been sanded into the wings.</p><p>Pic 2. After the dihedral has been sanded in, glue 'em together. I normally use a bead of hot melt. After it has completely cooled (dried?) I take a thin bead of PU glue and rub it into the joint. When it expands it assures complete adhesion. I put a half width strip of duct tape, preferably white or black, across the top of the joint for looks and strength. It also assures the PU glue doesn't ooze out the top of the wing. Under the wing, I cut a popsicle stick halfway through, bend in the dihedral and hot melt it to the wing at the 33% chord mark. This is also the CG point. Lastly, I run a strip of fiber reinforced tape across the bottom of the wing, tip to tip. This tape is brute strong a gives a great deal of strength to the wing without adding any appreciable weight.</p><p>NOTE: This plane was designed as a primary trainer and was designed around the GWS IPS motor system. If you are goiing to put a powerhouse motor in it, additional bracing may be needed. On the Blu-Baby Park (GWS 350-C), I used bamboo wing struts. </p><p><a href="https://www.rcgroups.com/forums/showpost.php?p=7423038&postcount=75">https://www.rcgroups.com/forums/showpost.php?p=7423038&postcount=75</a></p><p><br /></p><p><img height="150" src="https://static.rcgroups.net/forums/attachments/4/1/2/8/0/a1300477-96-Mate_wings.jpg" style="-webkit-user-select: none; display: block; margin: auto;" width="200" /></p><img height="100" src="https://static.rcgroups.net/forums/attachments/4/1/2/8/0/a1300476-176-Dihedral.jpg" style="-webkit-user-select: none; display: block; margin: auto;" width="200" />Mark Harrisonhttp://www.blogger.com/profile/15303543607242803764noreply@blogger.com0