diff options
author | raveit65 (via Travis CI) <[email protected]> | 2024-02-15 14:30:09 +0000 |
---|---|---|
committer | raveit65 (via Travis CI) <[email protected]> | 2024-02-15 14:30:09 +0000 |
commit | 2293e32bac8ff421a58ee6d0a8e43873fb8e01d2 (patch) | |
tree | b8011cb4ce6bdf30f7692fa98d4289f2303be9c8 /2024-02-14-202956-5881-1@f4ce3914b76b_master | |
download | libmateweather-gh-pages.tar.bz2 libmateweather-gh-pages.tar.xz |
Deploy mate-desktop/libmateweather to github.com/mate-desktop/libmateweather.git:gh-pagesgh-pages
Diffstat (limited to '2024-02-14-202956-5881-1@f4ce3914b76b_master')
14 files changed, 14953 insertions, 0 deletions
diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/index.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/index.html new file mode 100644 index 0000000..b91ab0d --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/index.html @@ -0,0 +1,133 @@ +<html> +<head> +<title>rootdir - scan-build results</title> +<link type="text/css" rel="stylesheet" href="scanview.css"/> +<script src="sorttable.js"></script> +<script language='javascript' type="text/javascript"> +function SetDisplay(RowClass, DisplayVal) +{ + var Rows = document.getElementsByTagName("tr"); + for ( var i = 0 ; i < Rows.length; ++i ) { + if (Rows[i].className == RowClass) { + Rows[i].style.display = DisplayVal; + } + } +} + +function CopyCheckedStateToCheckButtons(SummaryCheckButton) { + var Inputs = document.getElementsByTagName("input"); + for ( var i = 0 ; i < Inputs.length; ++i ) { + if (Inputs[i].type == "checkbox") { + if(Inputs[i] != SummaryCheckButton) { + Inputs[i].checked = SummaryCheckButton.checked; + Inputs[i].onclick(); + } + } + } +} + +function returnObjById( id ) { + if (document.getElementById) + var returnVar = document.getElementById(id); + else if (document.all) + var returnVar = document.all[id]; + else if (document.layers) + var returnVar = document.layers[id]; + return returnVar; +} + +var NumUnchecked = 0; + +function ToggleDisplay(CheckButton, ClassName) { + if (CheckButton.checked) { + SetDisplay(ClassName, ""); + if (--NumUnchecked == 0) { + returnObjById("AllBugsCheck").checked = true; + } + } + else { + SetDisplay(ClassName, "none"); + NumUnchecked++; + returnObjById("AllBugsCheck").checked = false; + } +} +</script> +<!-- SUMMARYENDHEAD --> +</head> +<body> +<h1>rootdir - scan-build results</h1> + +<table> +<tr><th>User:</th><td>root@b0e403408431</td></tr> +<tr><th>Working Directory:</th><td>/rootdir</td></tr> +<tr><th>Command Line:</th><td>make -j 2</td></tr> +<tr><th>Clang Version:</th><td>clang version 17.0.6 (Fedora 17.0.6-2.fc39) +</td></tr> +<tr><th>Date:</th><td>Wed Feb 14 20:29:56 2024</td></tr> +</table> +<h2>Bug Summary</h2><table> +<thead><tr><td>Bug Type</td><td>Quantity</td><td class="sorttable_nosort">Display?</td></tr></thead> +<tr style="font-weight:bold"><td class="SUMM_DESC">All Bugs</td><td class="Q">11</td><td><center><input type="checkbox" id="AllBugsCheck" onClick="CopyCheckedStateToCheckButtons(this);" checked/></center></td></tr> +<tr><th>Logic error</th><th colspan=2></th></tr> +<tr><td class="SUMM_DESC">Dereference of null pointer</td><td class="Q">1</td><td><center><input type="checkbox" onClick="ToggleDisplay(this,'bt_logic_error_dereference_of_null_pointer');" checked/></center></td></tr> +<tr><td class="SUMM_DESC">Out-of-bound access</td><td class="Q">2</td><td><center><input type="checkbox" onClick="ToggleDisplay(this,'bt_logic_error_out-of-bound_access');" checked/></center></td></tr> +<tr><th>Security</th><th colspan=2></th></tr> +<tr><td class="SUMM_DESC">Potential insecure memory buffer bounds restriction in call 'strcpy'</td><td class="Q">1</td><td><center><input type="checkbox" onClick="ToggleDisplay(this,'bt_security_potential_insecure_memory_buffer_bounds_restriction_in_call_strcpy_');" checked/></center></td></tr> +<tr><th>Unix Stream API Error</th><th colspan=2></th></tr> +<tr><td class="SUMM_DESC">Resource Leak</td><td class="Q">1</td><td><center><input type="checkbox" onClick="ToggleDisplay(this,'bt_unix_stream_api_error_resource_leak');" checked/></center></td></tr> +<tr><th>Unused code</th><th colspan=2></th></tr> +<tr><td class="SUMM_DESC">Dead assignment</td><td class="Q">2</td><td><center><input type="checkbox" onClick="ToggleDisplay(this,'bt_unused_code_dead_assignment');" checked/></center></td></tr> +<tr><td class="SUMM_DESC">Dead initialization</td><td class="Q">2</td><td><center><input type="checkbox" onClick="ToggleDisplay(this,'bt_unused_code_dead_initialization');" checked/></center></td></tr> +<tr><td class="SUMM_DESC">Unreachable code</td><td class="Q">2</td><td><center><input type="checkbox" onClick="ToggleDisplay(this,'bt_unused_code_unreachable_code');" checked/></center></td></tr> +</table> +<h2>Reports</h2> + +<table class="sortable" style="table-layout:automatic"> +<thead><tr> + <td>Bug Group</td> + <td class="sorttable_sorted">Bug Type<span id="sorttable_sortfwdind"> ▾</span></td> + <td>File</td> + <td>Function/Method</td> + <td class="Q">Line</td> + <td class="Q">Path Length</td> + <td class="sorttable_nosort"></td> + <!-- REPORTBUGCOL --> +</tr></thead> +<tbody> +<tr class="bt_unused_code_dead_assignment"><td class="DESC">Unused code</td><td class="DESC">Dead assignment</td><td>weather.c</td><td class="DESC">_weather_info_fill</td><td class="Q">495</td><td class="Q">1</td><td><a href="report-72c2f8.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-72c2f8.html" --> +</tr> +<tr class="bt_unused_code_dead_assignment"><td class="DESC">Unused code</td><td class="DESC">Dead assignment</td><td>weather-metar.c</td><td class="DESC">metar_parse</td><td class="Q">454</td><td class="Q">1</td><td><a href="report-d766a0.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-d766a0.html" --> +</tr> +<tr class="bt_unused_code_dead_initialization"><td class="DESC">Unused code</td><td class="DESC">Dead initialization</td><td>weather-sun.c</td><td class="DESC">calc_sun2</td><td class="Q">163</td><td class="Q">1</td><td><a href="report-1b914f.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-1b914f.html" --> +</tr> +<tr class="bt_unused_code_dead_initialization"><td class="DESC">Unused code</td><td class="DESC">Dead initialization</td><td>weather-sun.c</td><td class="DESC">calc_sun2</td><td class="Q">162</td><td class="Q">1</td><td><a href="report-339c98.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-339c98.html" --> +</tr> +<tr class="bt_logic_error_dereference_of_null_pointer"><td class="DESC">Logic error</td><td class="DESC">Dereference of null pointer</td><td>weather-met.c</td><td class="DESC">met_reprocess</td><td class="Q">111</td><td class="Q">27</td><td><a href="report-20fe9d.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-20fe9d.html" --> +</tr> +<tr class="bt_logic_error_out-of-bound_access"><td class="DESC">Logic error</td><td class="DESC">Out-of-bound access</td><td>weather-met.c</td><td class="DESC">met_reprocess</td><td class="Q">111</td><td class="Q">48</td><td><a href="report-0d7031.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-0d7031.html" --> +</tr> +<tr class="bt_logic_error_out-of-bound_access"><td class="DESC">Logic error</td><td class="DESC">Out-of-bound access</td><td>weather-metar.c</td><td class="DESC">metar_tok_vis</td><td class="Q">169</td><td class="Q">9</td><td><a href="report-9ba4eb.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-9ba4eb.html" --> +</tr> +<tr class="bt_security_potential_insecure_memory_buffer_bounds_restriction_in_call_strcpy_"><td class="DESC">Security</td><td class="DESC">Potential insecure memory buffer bounds restriction in call 'strcpy'</td><td>weather.c</td><td class="DESC">weather_info_get_update</td><td class="Q">719</td><td class="Q">1</td><td><a href="report-9e62c0.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-9e62c0.html" --> +</tr> +<tr class="bt_unix_stream_api_error_resource_leak"><td class="DESC">Unix Stream API Error</td><td class="DESC">Resource Leak</td><td>test_metar.c</td><td class="DESC">main</td><td class="Q">73</td><td class="Q">8</td><td><a href="report-3d7553.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-3d7553.html" --> +</tr> +<tr class="bt_unused_code_unreachable_code"><td class="DESC">Unused code</td><td class="DESC">Unreachable code</td><td>weather-metar.c</td><td class="DESC">metar_tok_vis</td><td class="Q">177</td><td class="Q">1</td><td><a href="report-54e1e1.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-54e1e1.html" --> +</tr> +<tr class="bt_unused_code_unreachable_code"><td class="DESC">Unused code</td><td class="DESC">Unreachable code</td><td>weather-sun.c</td><td class="DESC">weather_info_next_sun_event</td><td class="Q">335</td><td class="Q">1</td><td><a href="report-688a74.html#EndPath">View Report</a></td> +<!-- REPORTBUG id="report-688a74.html" --> +</tr> +</tbody> +</table> + +</body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-0d7031.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-0d7031.html new file mode 100644 index 0000000..4dc1ac6 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-0d7031.html @@ -0,0 +1,1000 @@ +<!doctype html> +<html> +<head> +<title>weather-met.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Out of bound memory access (access exceeds upper limit of memory block) --> + +<!-- BUGTYPE Out-of-bound access --> + +<!-- BUGCATEGORY Logic error --> + +<!-- BUGFILE /rootdir/libmateweather/weather-met.c --> + +<!-- FILENAME weather-met.c --> + +<!-- FUNCTIONNAME met_reprocess --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 0d7031a3e8b342ca9c2254a7fe17ae47 --> + +<!-- BUGLINE 111 --> + +<!-- BUGCOLUMN 8 --> + +<!-- BUGPATHLENGTH 48 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather-met.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 111, column 8</a><br />Out of bound memory access (access exceeds upper limit of memory block)</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather-met.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather-met.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"31": 1, "32": 1, "33": 1, "34": 1, "35": 1, "36": 1, "37": 1, "38": 1, "39": 1, "40": 1, "42": 1, "44": 1, "46": 1, "47": 1, "50": 1, "51": 1, "53": 1, "54": 1, "64": 1, "65": 1, "71": 1, "91": 1, "92": 1, "93": 1, "94": 1, "96": 1, "97": 1, "98": 1, "99": 1, "101": 1, "102": 1, "104": 1, "105": 1, "106": 1, "110": 1, "111": 1, "121": 1, "122": 1, "123": 1, "124": 1, "125": 1, "126": 1, "127": 1, "129": 1, "131": 1, "132": 1, "134": 1, "135": 1, "137": 1, "139": 1, "145": 1, "146": 1, "147": 1, "148": 1, "150": 1, "152": 1, "159": 1}, "6479": {"308": 1, "309": 1, "310": 1, "311": 1, "314": 1, "321": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + <path class="arrow" id="arrow0"/> + <path class="arrow" id="arrow1"/> + <path class="arrow" id="arrow2"/> + <path class="arrow" id="arrow3"/> + <path class="arrow" id="arrow4"/> + <path class="arrow" id="arrow5"/> + <path class="arrow" id="arrow6"/> + <path class="arrow" id="arrow7"/> + <path class="arrow" id="arrow8"/> + <path class="arrow" id="arrow9"/> + <path class="arrow" id="arrow10"/> + <path class="arrow" id="arrow11"/> + <path class="arrow" id="arrow12"/> + <path class="arrow" id="arrow13"/> + <path class="arrow" id="arrow14"/> + <path class="arrow" id="arrow15"/> + <path class="arrow" id="arrow16"/> + <path class="arrow" id="arrow17"/> + <path class="arrow" id="arrow18"/> + <path class="arrow" id="arrow19"/> + <path class="arrow" id="arrow20"/> + <path class="arrow" id="arrow21"/> + <path class="arrow" id="arrow22"/> + <path class="arrow" id="arrow23"/> + <path class="arrow" id="arrow24"/> + <path class="arrow" id="arrow25"/> + <path class="arrow" id="arrow26"/> + <path class="arrow" id="arrow27"/> + <path class="arrow" id="arrow28"/> + <path class="arrow" id="arrow29"/> + <path class="arrow" id="arrow30"/> + <path class="arrow" id="arrow31"/> + <path class="arrow" id="arrow32"/> + <path class="arrow" id="arrow33"/> + <path class="arrow" id="arrow34"/> + <path class="arrow" id="arrow35"/> + <path class="arrow" id="arrow36"/> + <path class="arrow" id="arrow37"/> + <path class="arrow" id="arrow38"/> + <path class="arrow" id="arrow39"/> + <path class="arrow" id="arrow40"/> + <path class="arrow" id="arrow41"/> + <path class="arrow" id="arrow42"/> + <path class="arrow" id="arrow43"/> + <path class="arrow" id="arrow44"/> + <path class="arrow" id="arrow45"/> + <path class="arrow" id="arrow46"/> + <path class="arrow" id="arrow47"/> + <path class="arrow" id="arrow48"/> + <path class="arrow" id="arrow49"/> + <path class="arrow" id="arrow50"/> + <path class="arrow" id="arrow51"/> + <path class="arrow" id="arrow52"/> + <path class="arrow" id="arrow53"/> + <path class="arrow" id="arrow54"/> + <path class="arrow" id="arrow55"/> + <path class="arrow" id="arrow56"/> + <path class="arrow" id="arrow57"/> + <path class="arrow" id="arrow58"/> + <path class="arrow" id="arrow59"/> + <path class="arrow" id="arrow60"/> + <path class="arrow" id="arrow61"/> + <path class="arrow" id="arrow62"/> + <path class="arrow" id="arrow63"/> + <path class="arrow" id="arrow64"/> + <path class="arrow" id="arrow65"/> + <path class="arrow" id="arrow66"/> + <path class="arrow" id="arrow67"/> + <path class="arrow" id="arrow68"/> + <path class="arrow" id="arrow69"/> + <path class="arrow" id="arrow70"/> + <path class="arrow" id="arrow71"/> + <path class="arrow" id="arrow72"/> + <path class="arrow" id="arrow73"/> + <path class="arrow" id="arrow74"/> + <path class="arrow" id="arrow75"/> + <path class="arrow" id="arrow76"/> + <path class="arrow" id="arrow77"/> + <path class="arrow" id="arrow78"/> + <path class="arrow" id="arrow79"/> + <path class="arrow" id="arrow80"/> + <path class="arrow" id="arrow81"/> + <path class="arrow" id="arrow82"/> + <path class="arrow" id="arrow83"/> + <path class="arrow" id="arrow84"/> + <path class="arrow" id="arrow85"/> + <path class="arrow" id="arrow86"/> + <path class="arrow" id="arrow87"/> + <path class="arrow" id="arrow88"/> + <path class="arrow" id="arrow89"/> + <path class="arrow" id="arrow90"/> + <path class="arrow" id="arrow91"/> + <path class="arrow" id="arrow92"/> + <path class="arrow" id="arrow93"/> + <path class="arrow" id="arrow94"/> + <path class="arrow" id="arrow95"/> + <path class="arrow" id="arrow96"/> + <path class="arrow" id="arrow97"/> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 98,95,93,88,86,85,84,82,81,76,74,70,70,66,64,60,60,56,54,51,51,49,46,44,42,37,33,32,31,27,25,25,23,22,21,18,17,13,12,9,8,5,3,2,1,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather-met.c - UK Met Office forecast source</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"><span class='directive'>#include <ctype.h></span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"><span class='directive'>#include <stdlib.h></span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"><span class='directive'>#include <string.h></span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#include "weather.h"</span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"><span id="start48"><span class='keyword'>static</span></span> <span class='keyword'>char</span> *</td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line">met_reprocess (<span class='keyword'>char</span> *x, <span class='keyword'>int</span> len)</td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> <span id="start47"><span id="end48"><span class='keyword'>char</span></span></span> *p = x;</td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"> <span class='keyword'>char</span> *o;</td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"> <span class='keyword'>int</span> spacing = 0;</td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> <span class='keyword'>static</span> gchar *buf;</td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"> <span class='keyword'>static</span> gint buflen = 0;</td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> gchar *lastspace = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"> <span class='keyword'>int</span> count = 0;</td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line"> <span id="start46"><span id="end47"><span class='keyword'>if</span></span></span> (<span id="start45"><span class="mrange"><span id="end46">buflen</span></span> < len</span>)</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path22" class="msg msgEvent" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">22</div></td><td><div class="PathNav"><a href="#Path21" title="Previous event (21)">←</a></div></td><td>Assuming 'buflen' is < 'len'</td><td><div class="PathNav"><a href="#Path23" title="Next event (23)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path23" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">23</div></td><td><div class="PathNav"><a href="#Path22" title="Previous event (22)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path24" title="Next event (24)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"> <span id="start44"><span id="end45"><span class='keyword'>if</span></span></span> (<span id="start43"><span id="end44"><span class='variable'>buf<table class='variable_popup'><tbody><tr><td valign='top'><div class='PathIndex PathIndexPopUp'>23.1</div></td><td>'buf' is null</td></tr></tbody></table></span></span></span>)</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path24" class="msg msgControl" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">24</div></td><td><div class="PathNav"><a href="#Path23" title="Previous event (23)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path25" title="Next event (25)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line"> g_free (buf);</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line"> <span id="start40"><span id="end41"><span id="start42"><span id="end43">buf</span></span></span></span> = g_malloc (<span id="start41"><span id="end42">len</span></span> + 1);</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line"> <span id="start39"><span id="end40">buflen</span></span> = len;</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> <span id="start38"><span id="end39">o</span></span> = buf;</td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> x += len; <span class='comment'>/* End mark */</span></td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> <span id="start3"><span id="end4"><span id="end5"><span id="start37"><span id="end38"><span class='keyword'>while</span></span></span></span></span></span> (<span id="start2"><span class="mrange"><span id="end3"><span id="start34"><span id="end35"><span id="start36"><span class="mrange"><span id="end37">*</span></span></span></span></span></span>p</span></span> && <span id="start1"><span class="mrange"><span id="end2"><span id="start35"><span id="end36"><span class='variable'>p<table class='variable_popup'><tbody><tr><td valign='top'><div class='PathIndex PathIndexPopUp'>25.1</div></td><td>'p' is < 'x'</td></tr></tbody></table></span></span></span></span></span> < x</span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path25" class="msg msgEvent" style="margin-left:12ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">25</div></td><td><div class="PathNav"><a href="#Path24" title="Previous event (24)">←</a></div></td><td>Assuming the condition is true</td><td><div class="PathNav"><a href="#Path26" title="Next event (26)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path26" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">26</div></td><td><div class="PathNav"><a href="#Path25" title="Previous event (25)">←</a></div></td><td>Loop condition is true. Entering loop body</td><td><div class="PathNav"><a href="#Path27" title="Next event (27)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path41" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">41</div></td><td><div class="PathNav"><a href="#Path40" title="Previous event (40)">←</a></div></td><td> Execution continues on line 53</td><td><div class="PathNav"><a href="#Path42" title="Next event (42)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path42" class="msg msgEvent" style="margin-left:12ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">42</div></td><td><div class="PathNav"><a href="#Path41" title="Previous event (41)">←</a></div></td><td>Assuming the condition is true</td><td><div class="PathNav"><a href="#Path43" title="Next event (43)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path43" class="msg msgEvent" style="margin-left:18ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">43</div></td><td><div class="PathNav"><a href="#Path42" title="Previous event (42)">←</a></div></td><td>Assuming 'p' is >= 'x'</td><td><div class="PathNav"><a href="#Path44" title="Next event (44)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path44" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">44</div></td><td><div class="PathNav"><a href="#Path43" title="Previous event (43)">←</a></div></td><td>Loop condition is false. Execution continues on line 111</td><td><div class="PathNav"><a href="#EndPath" title="Next event (45)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> <span class='keyword'>if</span> (<span id="start31"><span class="mrange"><span id="start32"><span id="end32"><span id="start33"><span id="end33"><span id="end34"><span class='macro'>g_ascii_isspace</span></span></span></span></span></span></span> (*p)<span class='macro_popup'>((g_ascii_table[(guchar) (*p)] & G_ASCII_SPACE) != 0)</span></span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path27" class="msg msgEvent" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">27</div></td><td><div class="PathNav"><a href="#Path26" title="Previous event (26)">←</a></div></td><td>Assuming the condition is false</td><td><div class="PathNav"><a href="#Path28" title="Next event (28)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path28" class="msg msgControl" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">28</div></td><td><div class="PathNav"><a href="#Path27" title="Previous event (27)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path29" title="Next event (29)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> <span class='keyword'>if</span> (!spacing) {</td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> spacing = 1;</td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> lastspace = o;</td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> *o++ = ' ';</td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> p++;</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> <span id="start30"><span id="end31">spacing</span></span> = 0;</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> <span id="start29"><span id="end30"><span class='keyword'>if</span></span></span> (<span id="start28"><span id="end29"><span class='variable'>count<table class='variable_popup'><tbody><tr><td valign='top'><div class='PathIndex PathIndexPopUp'>28.1</div></td><td>'count' is <= 75</td></tr></tbody></table></span></span></span> > 75 && lastspace) {</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> count = o - lastspace - 1;</td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> *lastspace = '\n';</td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"> lastspace = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span id="start27"><span id="end28"><span class='keyword'>if</span></span></span> (<span id="start26"><span class="mrange"><span id="end27">*</span></span>p == '&') {</td></tr></span> +<tr><td class="num"></td><td class="line"><div id="Path29" class="msg msgEvent" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">29</div></td><td><div class="PathNav"><a href="#Path28" title="Previous event (28)">←</a></div></td><td>Assuming the condition is false</td><td><div class="PathNav"><a href="#Path30" title="Next event (30)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path30" class="msg msgControl" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">30</div></td><td><div class="PathNav"><a href="#Path29" title="Previous event (29)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path31" title="Next event (31)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"> <span class='keyword'>if</span> (g_ascii_strncasecmp (p, <span class='string_literal'>"&amp;"</span>, 5) == 0) {</td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line"> *o++ = '&';</td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line"> p += 5;</td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> <span class='keyword'>if</span> (g_ascii_strncasecmp (p, <span class='string_literal'>"&lt;"</span>, 4) == 0) {</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> *o++ = '<';</td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> p += 4;</td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line"> <span class='keyword'>if</span> (g_ascii_strncasecmp (p, <span class='string_literal'>"&gt;"</span>, 4) == 0) {</td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line"> *o++ = '>';</td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"> p += 4;</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line"> <span id="start25"><span id="end26"><span class='keyword'>if</span></span></span> (<span id="start24"><span class="mrange">*</span><span id="end25">p</span> == '<') {</td></tr></span> +<tr><td class="num"></td><td class="line"><div id="Path31" class="msg msgEvent" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">31</div></td><td><div class="PathNav"><a href="#Path30" title="Previous event (30)">←</a></div></td><td>Assuming the condition is true</td><td><div class="PathNav"><a href="#Path32" title="Next event (32)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path32" class="msg msgControl" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">32</div></td><td><div class="PathNav"><a href="#Path31" title="Previous event (31)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path33" title="Next event (33)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> <span id="start23"><span id="end24"><span class='keyword'>if</span></span></span> (<span id="start21"><span class="mrange"><span id="end22">g_ascii_strncasecmp</span></span> (<span id="start22"><span id="end23">p</span></span>, <span class='string_literal'>"<BR>"</span>, 4) == 0</span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path33" class="msg msgEvent" style="margin-left:17ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">33</div></td><td><div class="PathNav"><a href="#Path32" title="Previous event (32)">←</a></div></td><td>Assuming the condition is true</td><td><div class="PathNav"><a href="#Path34" title="Next event (34)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path34" class="msg msgControl" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">34</div></td><td><div class="PathNav"><a href="#Path33" title="Previous event (33)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path35" title="Next event (35)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"> <span id="start20"><span id="end21">*</span></span>o++ = '\n';</td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> <span id="start19"><span id="end20">count</span></span> = 0;</td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> <span id="start18"><span id="end19"><span class='keyword'>if</span></span></span> (<span id="start17"><span class="mrange"><span id="end18">g_ascii_strncasecmp</span></span> (p, <span class='string_literal'>"<B>"</span>, 3) == 0</span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path35" class="msg msgEvent" style="margin-left:17ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">35</div></td><td><div class="PathNav"><a href="#Path34" title="Previous event (34)">←</a></div></td><td>Assuming the condition is true</td><td><div class="PathNav"><a href="#Path36" title="Next event (36)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path36" class="msg msgControl" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">36</div></td><td><div class="PathNav"><a href="#Path35" title="Previous event (35)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path37" title="Next event (37)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> <span id="start16"><span id="end17">*</span></span>o++ = '\n';</td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"> *o++ = '\n';</td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line"> <span id="start15"><span id="end16">count</span></span> = 0;</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> <span id="start14"><span id="end15">p</span></span>++;</td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line"> <span id="start13"><span id="end14"><span class='keyword'>while</span></span></span> (<span id="start10"><span id="end11"><span id="start12"><span class="mrange"><span id="end13">*</span></span></span></span>p</span> && <span id="start11"><span class="mrange"><span id="end12">*</span></span>p != '>')</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path37" class="msg msgEvent" style="margin-left:20ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">37</div></td><td><div class="PathNav"><a href="#Path36" title="Previous event (36)">←</a></div></td><td>Assuming the condition is true</td><td><div class="PathNav"><a href="#Path38" title="Next event (38)">→</a></div></td></tr></table></div></td></tr></span> +<tr><td class="num"></td><td class="line"><div id="Path38" class="msg msgEvent" style="margin-left:26ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">38</div></td><td><div class="PathNav"><a href="#Path37" title="Previous event (37)">←</a></div></td><td>Assuming the condition is false</td><td><div class="PathNav"><a href="#Path39" title="Next event (39)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path39" class="msg msgControl" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">39</div></td><td><div class="PathNav"><a href="#Path38" title="Previous event (38)">←</a></div></td><td>Loop condition is false. Execution continues on line 104</td><td><div class="PathNav"><a href="#Path40" title="Next event (40)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> p++;</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> <span id="start9"><span id="end10"><span class='keyword'>if</span></span></span> (*<span id="start8"><span id="end9">p</span></span>)</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path40" class="msg msgControl" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">40</div></td><td><div class="PathNav"><a href="#Path39" title="Previous event (39)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path41" title="Next event (41)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> <span id="start7"><span id="end8">p</span></span>++;</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> <span id="start5"><span id="start6"><span id="end7"><span class='keyword'>continue</span></span></span></span>;</td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> *o++ = *p++;</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> <span id="start4"><span id="end6">}</td></tr></span></span> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> <span class="mrange"><span id="start0"><span id="end1">*</span></span>o <span id="end0">=</span> 0</span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:8ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">45</div></td><td><div class="PathNav"><a href="#Path44" title="Previous event (44)">←</a></div></td><td>Out of bound memory access (access exceeds upper limit of memory block)</td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line"> <span class='comment'>* Parse the metoffice forecast info.</span></td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> <span class='comment'>* For mate 3.0 we want to just embed an HTML matecomponent component and</span></td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line"> <span class='comment'>* be done with this ;)</span></td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line"><span id="start80"><span class='keyword'>static</span></span> gchar *</td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line">met_parse (<span class='keyword'>const</span> gchar *meto)</td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line"> <span id="start79"><span id="end80">gchar</span></span> *p;</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> gchar *rp;</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line"> gchar *r = <span class='macro'>g_strdup (<span class='string_literal'>"Met Office Forecast\n"</span>)<span class='macro_popup'>g_strdup_inline ("Met Office Forecast\n")</span></span>;</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line"> <span id="start78"><span id="end79">gchar</span></span> *t;</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> <span id="start71"><span id="start72"><span id="end72"><span id="start73"><span id="end73"><span id="start74"><span id="end74"><span id="start75"><span id="end75"><span class="mrange"><span id="start76"><span id="end76"><span id="start77"><span id="end77"><span id="end78"><span class='macro'>g_return_val_if_fail</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> (meto != NULL, r)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_18<br>; if (meto != ((void*)0)) _g_boolean_var_18 = 1; else _g_boolean_var_18<br> = 0; _g_boolean_var_18; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "meto != NULL");<br> return (r); } } while (0)</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path9" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">9</div></td><td><div class="PathNav"><a href="#Path8" title="Previous event (8)">←</a></div></td><td>Assuming 'meto' is not equal to null</td><td><div class="PathNav"><a href="#Path10" title="Next event (10)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path10" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">10</div></td><td><div class="PathNav"><a href="#Path9" title="Previous event (9)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path11" title="Next event (11)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path11" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">11</div></td><td><div class="PathNav"><a href="#Path10" title="Previous event (10)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path12" title="Next event (12)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path12" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">12</div></td><td><div class="PathNav"><a href="#Path11" title="Previous event (11)">←</a></div></td><td>Loop condition is false. Exiting loop</td><td><div class="PathNav"><a href="#Path13" title="Next event (13)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> <span id="start68"><span id="end69"><span id="start70"><span id="end71">p</span></span></span></span> = strstr (<span id="start69"><span id="end70">meto</span></span>, <span class='string_literal'>"Summary: </b>"</span>);</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> <span id="start61"><span id="start62"><span id="end62"><span id="start63"><span id="end63"><span id="start64"><span id="end64"><span id="start65"><span id="end65"><span class="mrange"><span id="start66"><span id="end66"><span id="start67"><span id="end67"><span id="end68"><span class='macro'>g_return_val_if_fail</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> (p != NULL, r)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_19<br>; if (p != ((void*)0)) _g_boolean_var_19 = 1; else _g_boolean_var_19<br> = 0; _g_boolean_var_19; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "p != NULL"); return<br> (r); } } while (0)</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path13" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">13</div></td><td><div class="PathNav"><a href="#Path12" title="Previous event (12)">←</a></div></td><td>Assuming 'p' is not equal to null</td><td><div class="PathNav"><a href="#Path14" title="Next event (14)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path14" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">14</div></td><td><div class="PathNav"><a href="#Path13" title="Previous event (13)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path15" title="Next event (15)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path15" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">15</div></td><td><div class="PathNav"><a href="#Path14" title="Previous event (14)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path16" title="Next event (16)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path16" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">16</div></td><td><div class="PathNav"><a href="#Path15" title="Previous event (15)">←</a></div></td><td>Loop condition is false. Exiting loop</td><td><div class="PathNav"><a href="#Path17" title="Next event (17)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> <span id="start58"><span id="end59"><span id="start60"><span id="end61">rp</span></span></span></span> = strstr (<span id="start59"><span id="end60">p</span></span>, <span class='string_literal'>"Text issued at:"</span>);</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> <span id="start51"><span id="start52"><span id="end52"><span id="start53"><span id="end53"><span id="start54"><span id="end54"><span id="start55"><span id="end55"><span class="mrange"><span id="start56"><span id="end56"><span id="start57"><span id="end57"><span id="end58"><span class='macro'>g_return_val_if_fail</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> (rp != NULL, r)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_20<br>; if (rp != ((void*)0)) _g_boolean_var_20 = 1; else _g_boolean_var_20<br> = 0; _g_boolean_var_20; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "rp != NULL"); return<br> (r); } } while (0)</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path17" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">17</div></td><td><div class="PathNav"><a href="#Path16" title="Previous event (16)">←</a></div></td><td>Assuming 'rp' is not equal to null</td><td><div class="PathNav"><a href="#Path18" title="Next event (18)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path18" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">18</div></td><td><div class="PathNav"><a href="#Path17" title="Previous event (17)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path19" title="Next event (19)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path19" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">19</div></td><td><div class="PathNav"><a href="#Path18" title="Previous event (18)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path20" title="Next event (20)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path20" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">20</div></td><td><div class="PathNav"><a href="#Path19" title="Previous event (19)">←</a></div></td><td>Loop condition is false. Exiting loop</td><td><div class="PathNav"><a href="#Path21" title="Next event (21)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> <span id="start50"><span id="end51">p</span></span> += 13;</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> <span class='comment'>/* p to rp is the text block we want but in HTML malformat */</span></td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> <span id="start49"><span id="end50">t</span></span> = g_strconcat (r, <span class="mrange"><span id="end49">met_reprocess</span> (p, rp - p)</span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path21" class="msg msgEvent" style="margin-left:25ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">21</div></td><td><div class="PathNav"><a href="#Path20" title="Previous event (20)">←</a></div></td><td>Calling 'met_reprocess'</td><td><div class="PathNav"><a href="#Path22" title="Next event (22)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> g_free (r);</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> <span class='keyword'>return</span> t;</td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line">met_finish (SoupSession *session, SoupMessage *msg, gpointer data)</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> <span id="start97">WeatherInfo</span> *info = (WeatherInfo *)data;</td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line"> <span id="start87"><span id="start90"><span id="start91"><span id="end91"><span id="start92"><span id="end92"><span id="start93"><span id="end93"><span id="start94"><span id="end94"><span class="mrange"><span id="start95"><span id="end95"><span id="start96"><span id="end96"><span id="end97"><span class='macro'>g_return_if_fail</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_21<br>; if (info != ((void*)0)) _g_boolean_var_21 = 1; else _g_boolean_var_21<br> = 0; _g_boolean_var_21; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path1" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">1</div></td><td>Assuming 'info' is not equal to null</td><td><div class="PathNav"><a href="#Path2" title="Next event (2)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path2" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">2</div></td><td><div class="PathNav"><a href="#Path1" title="Previous event (1)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path3" title="Next event (3)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path3" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">3</div></td><td><div class="PathNav"><a href="#Path2" title="Previous event (2)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path4" title="Next event (4)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> <span id="start86"><span id="end87"><span id="start89"><span id="end90"><span class='keyword'>if</span></span></span></span></span> (!<span id="start83"><span class="mrange"><span id="start84"><span id="end84"><span class="mrange"><span id="start85"><span id="end85"><span id="end86"><span id="start88"><span id="end88"><span id="end89"><span class='macro'>SOUP_STATUS_IS_SUCCESSFUL</span></span></span></span></span></span></span></span></span></span></span> (msg->status_code)<span class='macro_popup'>((msg->status_code) >= 200 && (msg->status_code<br>) < 300)</span></span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path4" class="msg msgControl" style="margin-left:10ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">4</div></td><td><div class="PathNav"><a href="#Path3" title="Previous event (3)">←</a></div></td><td>Loop condition is false. Exiting loop</td><td><div class="PathNav"><a href="#Path5" title="Next event (5)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path5" class="msg msgEvent" style="margin-left:10ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">5</div></td><td><div class="PathNav"><a href="#Path4" title="Previous event (4)">←</a></div></td><td>Assuming field 'status_code' is >= 200</td><td><div class="PathNav"><a href="#Path6" title="Next event (6)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path6" class="msg msgEvent" style="margin-left:10ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">6</div></td><td><div class="PathNav"><a href="#Path5" title="Previous event (5)">←</a></div></td><td>Assuming field 'status_code' is < 300</td><td><div class="PathNav"><a href="#Path7" title="Next event (7)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path7" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">7</div></td><td><div class="PathNav"><a href="#Path6" title="Previous event (6)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path8" title="Next event (8)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> g_warning (<span class='string_literal'>"Failed to get Met Office forecast data: %d %s.\n"</span>,</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> msg->status_code, msg->reason_phrase);</td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> request_done (info, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"> <span id="start82"><span id="end83">info</span></span>->forecast = <span class="mrange"><span id="end81">met_parse</span> (<span id="start81"><span id="end82">msg</span></span>->response_body->data)</span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path8" class="msg msgEvent" style="margin-left:22ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">8</div></td><td><div class="PathNav"><a href="#Path7" title="Previous event (7)">←</a></div></td><td>Calling 'met_parse'</td><td><div class="PathNav"><a href="#Path9" title="Next event (9)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line"> request_done (info, <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line">metoffice_start_open (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> gchar *url;</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> SoupMessage *msg;</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> WeatherLocation *loc;</td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> loc = info->location;</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> url = g_strdup_printf (<span class='string_literal'>"http://www.metoffice.gov.uk/weather/europe/uk/%s.html"</span>, loc->zone + 1);</td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> msg = soup_message_new (<span class='string_literal'>"GET"</span>, url);</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> soup_session_queue_message (info->session, msg, met_finish, info);</td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> g_free (url);</td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> info->requests_pending++;</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-1b914f.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-1b914f.html new file mode 100644 index 0000000..7787940 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-1b914f.html @@ -0,0 +1,1029 @@ +<!doctype html> +<html> +<head> +<title>weather-sun.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Value stored to 'obsLon' during its initialization is never read --> + +<!-- BUGTYPE Dead initialization --> + +<!-- BUGCATEGORY Unused code --> + +<!-- BUGFILE /rootdir/libmateweather/weather-sun.c --> + +<!-- FILENAME weather-sun.c --> + +<!-- FUNCTIONNAME calc_sun2 --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 1b914f72d85f7c3cbabde064abbfdcb1 --> + +<!-- BUGLINE 163 --> + +<!-- BUGCOLUMN 13 --> + +<!-- BUGPATHLENGTH 1 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather-sun.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 163, column 13</a><br />Value stored to 'obsLon' during its initialization is never read</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather-sun.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather-sun.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"163": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather-sun.c - Astronomy calculations for mateweather</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"> <span class='comment'>* Formulas from:</span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"> <span class='comment'>* "Practical Astronomy With Your Calculator" (3e), Peter Duffett-Smith</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> <span class='comment'>* Cambridge University Press 1988</span></td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"> <span class='comment'>* Unless otherwise noted, comments referencing "steps" are related to</span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"> <span class='comment'>* the algorithm presented in section 49 of above</span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"><span class='directive'>#include <math.h></span></td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"><span class='directive'>#include <time.h></span></td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"><span class='directive'>#include <glib.h></span></td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"><span class='directive'>#define <span class='macro'>ECCENTRICITY(d)<span class='macro_popup'>(0.01671123 - (d)/36525.*0.00004392)</span></span> (0.01671123 - (d)/36525.*0.00004392)</span></td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> <span class='comment'>* Ecliptic longitude of the sun at specified time (UT)</span></td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line"> <span class='comment'>* The algoithm is described in section 47 of Duffett-Smith</span></td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> <span class='comment'>* Return value is in radians</span></td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line">gdouble</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line">sunEclipLongitude(time_t t)</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> gdouble ndays, meanAnom, eccenAnom, delta, e, longitude;</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> <span class='comment'>* Start with an estimate based on a fixed daily rate</span></td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> ndays = <span class='macro'>EPOCH_TO_J2000(t)<span class='macro_popup'>((gdouble)(t)-946727935.816)</span></span> / 86400.;</td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> meanAnom = <span class='macro'>DEGREES_TO_RADIANS(MEAN_ECLIPTIC_LONGITUDE(ndays)<span class='macro_popup'>((fmod (((280.46457166 + (ndays)/36525.*35999.37244981) - (282.93768193<br> + (ndays)/36525.*0.32327364)),360.) / 180.) * 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> <span class='macro'>- PERIGEE_LONGITUDE(ndays))<span class='macro_popup'>((fmod (((280.46457166 + (ndays)/36525.*35999.37244981) - (282.93768193<br> + (ndays)/36525.*0.32327364)),360.) / 180.) * 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> <span class='comment'>* Approximate solution of Kepler's equation:</span></td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> <span class='comment'>* Find E which satisfies E - e sin(E) = M (mean anomaly)</span></td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> eccenAnom = meanAnom;</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> e = <span class='macro'>ECCENTRICITY(ndays)<span class='macro_popup'>(0.01671123 - (ndays)/36525.*0.00004392)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> <span class='keyword'>while</span> (1e-12 < fabs( delta = eccenAnom - e * sin(eccenAnom) - meanAnom))</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> eccenAnom -= delta / (1.- e * cos(eccenAnom));</td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"> <span class='comment'>* Earth's longitude on the ecliptic</span></td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"> longitude = fmod( <span class='macro'>DEGREES_TO_RADIANS (PERIGEE_LONGITUDE(ndays))<span class='macro_popup'>((fmod (((282.93768193 + (ndays)/36525.*0.32327364)),360.) / 180.<br>) * 3.14159265358979323846)</span></span></td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line"> + 2. * atan (sqrt ((1.+e)/(1.-e))</td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"> * tan (eccenAnom / 2.)),</td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line"> 2. * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>);</td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line"> <span class='keyword'>if</span> (longitude < 0.) {</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line"> longitude += 2 * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>;</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> <span class='keyword'>return</span> longitude;</td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line"><span class='keyword'>static</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line">ecliptic_obliquity (gdouble time)</td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line"> gdouble jc = <span class='macro'>EPOCH_TO_J2000 (time)<span class='macro_popup'>((gdouble)(time)-946727935.816)</span></span> / (36525. * 86400.);</td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line"> gdouble eclip_secs = (84381.448</td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"> - (46.84024 * jc)</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line"> - (59.e-5 * jc * jc)</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line"> + (1.813e-3 * jc * jc * jc));</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DEGREES_TO_RADIANS(eclip_secs / 3600.)<span class='macro_popup'>((fmod ((eclip_secs / 3600.),360.) / 180.) * 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> <span class='comment'>* Convert ecliptic longitude and latitude (radians) to equitorial</span></td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> <span class='comment'>* coordinates, expressed as right ascension (hours) and</span></td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> <span class='comment'>* declination (radians)</span></td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line">ecl2equ (gdouble time,</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> gdouble eclipLon, gdouble eclipLat,</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> gdouble *ra, gdouble *decl)</td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> gdouble mEclipObliq = ecliptic_obliquity(time);</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> <span class='keyword'>if</span> (ra) {</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> *ra = <span class='macro'>RADIANS_TO_HOURS (atan2 ((sin (eclipLon) * cos (mEclipObliq)<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> <span class='macro'>- tan (eclipLat) * sin(mEclipObliq)),<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> <span class='macro'>cos (eclipLon)))<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> <span class='keyword'>if</span> (*ra < 0.)</td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> *ra += 24.;</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> <span class='keyword'>if</span> (decl) {</td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line"> *decl = asin (( sin (eclipLat) * cos (mEclipObliq))</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> + cos (eclipLat) * sin (mEclipObliq) * sin(eclipLon));</td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> <span class='comment'>* Calculate rising and setting times for an object</span></td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line"> <span class='comment'>* based on it equitorial coordinates (section 33 & 15)</span></td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line"> <span class='comment'>* Returned "rise" and "set" values are sideral times in hours</span></td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line">gstObsv (gdouble ra, gdouble decl,</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> gdouble obsLat, gdouble obsLon,</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line"> gdouble *rise, gdouble *set)</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> <span class='keyword'>double</span> a = acos (-tan (obsLat) * tan (decl));</td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> <span class='keyword'>double</span> b;</td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>isnan (a)<span class='macro_popup'>__builtin_isnan (a)</span></span> != 0) {</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> *set = *rise = a;</td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> a = <span class='macro'>RADIANS_TO_HOURS (a)<span class='macro_popup'>((a) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> b = 24. - a + ra;</td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> a += ra;</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> a -= <span class='macro'>RADIANS_TO_HOURS (obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> b -= <span class='macro'>RADIANS_TO_HOURS (obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> <span class='keyword'>if</span> ((a = fmod (a, 24.)) < 0)</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> a += 24.;</td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> <span class='keyword'>if</span> ((b = fmod (b, 24.)) < 0)</td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line"> b += 24.;</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"> *set = a;</td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line"> *rise = b;</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"><span class='keyword'>static</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line">t0 (time_t date)</td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> gdouble t = ((gdouble)(<span class='macro'>EPOCH_TO_J2000 (date)<span class='macro_popup'>((gdouble)(date)-946727935.816)</span></span> / 86400)) / 36525.0;</td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> gdouble t0 = fmod (6.697374558 + 2400.051366 * t + 2.5862e-5 * t * t, 24.);</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> <span class='keyword'>if</span> (t0 < 0.)</td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> t0 += 24.;</td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> <span class='keyword'>return</span> t0;</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line">calc_sun2 (WeatherInfo *info, time_t t)</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> gdouble obsLat = info->location->latitude;</td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"> gdouble <span class="mrange">obsLon</span> = <span class="mrange">info->location->longitude</span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:13ex">Value stored to 'obsLon' during its initialization is never read</div></td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line"> time_t gm_midn;</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line"> time_t lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> gdouble gm_hoff, lambda;</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> gdouble ra1, ra2;</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> gdouble decl1, decl2;</td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> gdouble decl_midn, decl_noon;</td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> gdouble rise1, rise2;</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> gdouble set1, set2;</td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> gdouble tt, t00;</td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> gdouble x, u, dt;</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> <span class='comment'>/* Approximate preceding local midnight at observer's longitude */</span></td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> obsLat = info->location->latitude;</td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> obsLon = info->location->longitude;</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line"> gm_midn = t - (t % 86400);</td></tr> +<tr class="codeline" data-linenumber="179"><td class="num" id="LN179">179</td><td class="line"> gm_hoff = floor ((<span class='macro'>RADIANS_TO_DEGREES (obsLon)<span class='macro_popup'>((obsLon) * 180. / 3.14159265358979323846)</span></span> + 7.5) / 15.);</td></tr> +<tr class="codeline" data-linenumber="180"><td class="num" id="LN180">180</td><td class="line"> lcl_midn = gm_midn - 3600. * gm_hoff;</td></tr> +<tr class="codeline" data-linenumber="181"><td class="num" id="LN181">181</td><td class="line"> <span class='keyword'>if</span> (t - lcl_midn >= 86400)</td></tr> +<tr class="codeline" data-linenumber="182"><td class="num" id="LN182">182</td><td class="line"> lcl_midn += 86400;</td></tr> +<tr class="codeline" data-linenumber="183"><td class="num" id="LN183">183</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (lcl_midn > t)</td></tr> +<tr class="codeline" data-linenumber="184"><td class="num" id="LN184">184</td><td class="line"> lcl_midn -= 86400;</td></tr> +<tr class="codeline" data-linenumber="185"><td class="num" id="LN185">185</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="186"><td class="num" id="LN186">186</td><td class="line"> lambda = sunEclipLongitude (lcl_midn);</td></tr> +<tr class="codeline" data-linenumber="187"><td class="num" id="LN187">187</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="188"><td class="num" id="LN188">188</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="189"><td class="num" id="LN189">189</td><td class="line"> <span class='comment'>* Calculate equitorial coordinates of sun at previous</span></td></tr> +<tr class="codeline" data-linenumber="190"><td class="num" id="LN190">190</td><td class="line"> <span class='comment'>* and next local midnights</span></td></tr> +<tr class="codeline" data-linenumber="191"><td class="num" id="LN191">191</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="192"><td class="num" id="LN192">192</td><td class="line"> ecl2equ (lcl_midn, lambda, 0., &ra1, &decl1);</td></tr> +<tr class="codeline" data-linenumber="193"><td class="num" id="LN193">193</td><td class="line"> ecl2equ (lcl_midn + 86400.,</td></tr> +<tr class="codeline" data-linenumber="194"><td class="num" id="LN194">194</td><td class="line"> lambda + <span class='macro'>DEGREES_TO_RADIANS(SOL_PROGRESSION)<span class='macro_popup'>((fmod (((360./365.242191)),360.) / 180.) * 3.14159265358979323846<br>)</span></span>, 0.,</td></tr> +<tr class="codeline" data-linenumber="195"><td class="num" id="LN195">195</td><td class="line"> &ra2, &decl2);</td></tr> +<tr class="codeline" data-linenumber="196"><td class="num" id="LN196">196</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="197"><td class="num" id="LN197">197</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="198"><td class="num" id="LN198">198</td><td class="line"> <span class='comment'>* If the observer is within the Arctic or Antarctic Circles then</span></td></tr> +<tr class="codeline" data-linenumber="199"><td class="num" id="LN199">199</td><td class="line"> <span class='comment'>* the sun may be above or below the horizon for the full day.</span></td></tr> +<tr class="codeline" data-linenumber="200"><td class="num" id="LN200">200</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="201"><td class="num" id="LN201">201</td><td class="line"> decl_midn = <span class='macro'>MIN(decl1,decl2)<span class='macro_popup'>(((decl1) < (decl2)) ? (decl1) : (decl2))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="202"><td class="num" id="LN202">202</td><td class="line"> decl_noon = (decl1+decl2)/2.;</td></tr> +<tr class="codeline" data-linenumber="203"><td class="num" id="LN203">203</td><td class="line"> info->midnightSun =</td></tr> +<tr class="codeline" data-linenumber="204"><td class="num" id="LN204">204</td><td class="line"> (obsLat > (<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.-decl_midn)) || (obsLat < (-<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.-decl_midn));</td></tr> +<tr class="codeline" data-linenumber="205"><td class="num" id="LN205">205</td><td class="line"> info->polarNight =</td></tr> +<tr class="codeline" data-linenumber="206"><td class="num" id="LN206">206</td><td class="line"> (obsLat > (<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.+decl_noon)) || (obsLat < (-<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.+decl_noon));</td></tr> +<tr class="codeline" data-linenumber="207"><td class="num" id="LN207">207</td><td class="line"> <span class='keyword'>if</span> (info->midnightSun || info->polarNight) {</td></tr> +<tr class="codeline" data-linenumber="208"><td class="num" id="LN208">208</td><td class="line"> info->sunriseValid = info->sunsetValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="209"><td class="num" id="LN209">209</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="210"><td class="num" id="LN210">210</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="211"><td class="num" id="LN211">211</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="212"><td class="num" id="LN212">212</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="213"><td class="num" id="LN213">213</td><td class="line"> <span class='comment'>* Convert to rise and set times based positions for the preceding</span></td></tr> +<tr class="codeline" data-linenumber="214"><td class="num" id="LN214">214</td><td class="line"> <span class='comment'>* and following local midnights.</span></td></tr> +<tr class="codeline" data-linenumber="215"><td class="num" id="LN215">215</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="216"><td class="num" id="LN216">216</td><td class="line"> gstObsv (ra1, decl1, obsLat, obsLon - (gm_hoff * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span> / 12.), &rise1, &set1);</td></tr> +<tr class="codeline" data-linenumber="217"><td class="num" id="LN217">217</td><td class="line"> gstObsv (ra2, decl2, obsLat, obsLon - (gm_hoff * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span> / 12.), &rise2, &set2);</td></tr> +<tr class="codeline" data-linenumber="218"><td class="num" id="LN218">218</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="219"><td class="num" id="LN219">219</td><td class="line"> <span class='comment'>/* TODO: include calculations for regions near the poles. */</span></td></tr> +<tr class="codeline" data-linenumber="220"><td class="num" id="LN220">220</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>isnan(rise1)<span class='macro_popup'>__builtin_isnan (rise1)</span></span> || <span class='macro'>isnan(rise2)<span class='macro_popup'>__builtin_isnan (rise2)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="221"><td class="num" id="LN221">221</td><td class="line"> info->sunriseValid = info->sunsetValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="222"><td class="num" id="LN222">222</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="223"><td class="num" id="LN223">223</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="224"><td class="num" id="LN224">224</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="225"><td class="num" id="LN225">225</td><td class="line"> <span class='keyword'>if</span> (rise2 < rise1) {</td></tr> +<tr class="codeline" data-linenumber="226"><td class="num" id="LN226">226</td><td class="line"> rise2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="227"><td class="num" id="LN227">227</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="228"><td class="num" id="LN228">228</td><td class="line"> <span class='keyword'>if</span> (set2 < set1) {</td></tr> +<tr class="codeline" data-linenumber="229"><td class="num" id="LN229">229</td><td class="line"> set2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="230"><td class="num" id="LN230">230</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="231"><td class="num" id="LN231">231</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="232"><td class="num" id="LN232">232</td><td class="line"> tt = t0(lcl_midn);</td></tr> +<tr class="codeline" data-linenumber="233"><td class="num" id="LN233">233</td><td class="line"> t00 = tt - (gm_hoff + <span class='macro'>RADIANS_TO_HOURS(obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>) * 1.002737909;</td></tr> +<tr class="codeline" data-linenumber="234"><td class="num" id="LN234">234</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="235"><td class="num" id="LN235">235</td><td class="line"> <span class='keyword'>if</span> (t00 < 0.)</td></tr> +<tr class="codeline" data-linenumber="236"><td class="num" id="LN236">236</td><td class="line"> t00 += 24.;</td></tr> +<tr class="codeline" data-linenumber="237"><td class="num" id="LN237">237</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="238"><td class="num" id="LN238">238</td><td class="line"> <span class='keyword'>if</span> (rise1 < t00) {</td></tr> +<tr class="codeline" data-linenumber="239"><td class="num" id="LN239">239</td><td class="line"> rise1 += 24.;</td></tr> +<tr class="codeline" data-linenumber="240"><td class="num" id="LN240">240</td><td class="line"> rise2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="241"><td class="num" id="LN241">241</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="242"><td class="num" id="LN242">242</td><td class="line"> <span class='keyword'>if</span> (set1 < t00) {</td></tr> +<tr class="codeline" data-linenumber="243"><td class="num" id="LN243">243</td><td class="line"> set1 += 24.;</td></tr> +<tr class="codeline" data-linenumber="244"><td class="num" id="LN244">244</td><td class="line"> set2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="245"><td class="num" id="LN245">245</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="246"><td class="num" id="LN246">246</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="247"><td class="num" id="LN247">247</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="248"><td class="num" id="LN248">248</td><td class="line"> <span class='comment'>* Interpolate between the two to get a rise and set time</span></td></tr> +<tr class="codeline" data-linenumber="249"><td class="num" id="LN249">249</td><td class="line"> <span class='comment'>* based on the sun's position at local noon (step 8)</span></td></tr> +<tr class="codeline" data-linenumber="250"><td class="num" id="LN250">250</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="251"><td class="num" id="LN251">251</td><td class="line"> rise1 = (24.07 * rise1 - t00 * (rise2 - rise1)) / (24.07 + rise1 - rise2);</td></tr> +<tr class="codeline" data-linenumber="252"><td class="num" id="LN252">252</td><td class="line"> set1 = (24.07 * set1 - t00 * (set2 - set1)) / (24.07 + set1 - set2);</td></tr> +<tr class="codeline" data-linenumber="253"><td class="num" id="LN253">253</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="254"><td class="num" id="LN254">254</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="255"><td class="num" id="LN255">255</td><td class="line"> <span class='comment'>* Calculate an adjustment value to account for parallax,</span></td></tr> +<tr class="codeline" data-linenumber="256"><td class="num" id="LN256">256</td><td class="line"> <span class='comment'>* refraction and the Sun's finite diameter (steps 9,10)</span></td></tr> +<tr class="codeline" data-linenumber="257"><td class="num" id="LN257">257</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="258"><td class="num" id="LN258">258</td><td class="line"> decl2 = (decl1 + decl2) / 2.;</td></tr> +<tr class="codeline" data-linenumber="259"><td class="num" id="LN259">259</td><td class="line"> x = <span class='macro'>DEGREES_TO_RADIANS(0.830725)<span class='macro_popup'>((fmod ((0.830725),360.) / 180.) * 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="260"><td class="num" id="LN260">260</td><td class="line"> u = acos ( sin(obsLat) / cos(decl2) );</td></tr> +<tr class="codeline" data-linenumber="261"><td class="num" id="LN261">261</td><td class="line"> dt = <span class='macro'>RADIANS_TO_HOURS ( asin ( sin(x) / sin(u) ) / cos(decl2) )<span class='macro_popup'>((asin ( sin(x) / sin(u) ) / cos(decl2)) * 12. / 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="262"><td class="num" id="LN262">262</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="263"><td class="num" id="LN263">263</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="264"><td class="num" id="LN264">264</td><td class="line"> <span class='comment'>* Subtract the correction value from sunrise and add to sunset,</span></td></tr> +<tr class="codeline" data-linenumber="265"><td class="num" id="LN265">265</td><td class="line"> <span class='comment'>* then (step 11) convert sideral times to UT</span></td></tr> +<tr class="codeline" data-linenumber="266"><td class="num" id="LN266">266</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="267"><td class="num" id="LN267">267</td><td class="line"> rise1 = (rise1 - dt - tt) * 0.9972695661;</td></tr> +<tr class="codeline" data-linenumber="268"><td class="num" id="LN268">268</td><td class="line"> <span class='keyword'>if</span> (rise1 < 0.)</td></tr> +<tr class="codeline" data-linenumber="269"><td class="num" id="LN269">269</td><td class="line"> rise1 += 24;</td></tr> +<tr class="codeline" data-linenumber="270"><td class="num" id="LN270">270</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (rise1 >= 24.)</td></tr> +<tr class="codeline" data-linenumber="271"><td class="num" id="LN271">271</td><td class="line"> rise1 -= 24.;</td></tr> +<tr class="codeline" data-linenumber="272"><td class="num" id="LN272">272</td><td class="line"> info->sunriseValid = ((rise1 >= 0.) && (rise1 < 24.));</td></tr> +<tr class="codeline" data-linenumber="273"><td class="num" id="LN273">273</td><td class="line"> info->sunrise = (rise1 * 3600.) + lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="274"><td class="num" id="LN274">274</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="275"><td class="num" id="LN275">275</td><td class="line"> set1 = (set1 + dt - tt) * 0.9972695661;</td></tr> +<tr class="codeline" data-linenumber="276"><td class="num" id="LN276">276</td><td class="line"> <span class='keyword'>if</span> (set1 < 0.)</td></tr> +<tr class="codeline" data-linenumber="277"><td class="num" id="LN277">277</td><td class="line"> set1 += 24;</td></tr> +<tr class="codeline" data-linenumber="278"><td class="num" id="LN278">278</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (set1 >= 24.)</td></tr> +<tr class="codeline" data-linenumber="279"><td class="num" id="LN279">279</td><td class="line"> set1 -= 24.;</td></tr> +<tr class="codeline" data-linenumber="280"><td class="num" id="LN280">280</td><td class="line"> info->sunsetValid = ((set1 >= 0.) && (set1 < 24.));</td></tr> +<tr class="codeline" data-linenumber="281"><td class="num" id="LN281">281</td><td class="line"> info->sunset = (set1 * 3600.) + lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="282"><td class="num" id="LN282">282</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="283"><td class="num" id="LN283">283</td><td class="line"> <span class='keyword'>return</span> (info->sunriseValid || info->sunsetValid);</td></tr> +<tr class="codeline" data-linenumber="284"><td class="num" id="LN284">284</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="285"><td class="num" id="LN285">285</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="286"><td class="num" id="LN286">286</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="287"><td class="num" id="LN287">287</td><td class="line"> <span class='comment'>* calc_sun_time:</span></td></tr> +<tr class="codeline" data-linenumber="288"><td class="num" id="LN288">288</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure containing the observer's latitude</span></td></tr> +<tr class="codeline" data-linenumber="289"><td class="num" id="LN289">289</td><td class="line"> <span class='comment'>* and longitude in radians, fills in the sunrise and sunset times.</span></td></tr> +<tr class="codeline" data-linenumber="290"><td class="num" id="LN290">290</td><td class="line"> <span class='comment'>* @t: time_t</span></td></tr> +<tr class="codeline" data-linenumber="291"><td class="num" id="LN291">291</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="292"><td class="num" id="LN292">292</td><td class="line"> <span class='comment'>* Returns: gboolean indicating if the results are valid.</span></td></tr> +<tr class="codeline" data-linenumber="293"><td class="num" id="LN293">293</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="294"><td class="num" id="LN294">294</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="295"><td class="num" id="LN295">295</td><td class="line">calc_sun_time (WeatherInfo *info, time_t t)</td></tr> +<tr class="codeline" data-linenumber="296"><td class="num" id="LN296">296</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="297"><td class="num" id="LN297">297</td><td class="line"> <span class='keyword'>return</span> info->location->latlon_valid && calc_sun2 (info, t);</td></tr> +<tr class="codeline" data-linenumber="298"><td class="num" id="LN298">298</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="299"><td class="num" id="LN299">299</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="300"><td class="num" id="LN300">300</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="301"><td class="num" id="LN301">301</td><td class="line"> <span class='comment'>* calc_sun:</span></td></tr> +<tr class="codeline" data-linenumber="302"><td class="num" id="LN302">302</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure containing the observer's latitude</span></td></tr> +<tr class="codeline" data-linenumber="303"><td class="num" id="LN303">303</td><td class="line"> <span class='comment'>* and longitude in radians, fills in the sunrise and sunset times.</span></td></tr> +<tr class="codeline" data-linenumber="304"><td class="num" id="LN304">304</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="305"><td class="num" id="LN305">305</td><td class="line"> <span class='comment'>* Returns: gboolean indicating if the results are valid.</span></td></tr> +<tr class="codeline" data-linenumber="306"><td class="num" id="LN306">306</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="307"><td class="num" id="LN307">307</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="308"><td class="num" id="LN308">308</td><td class="line">calc_sun (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="309"><td class="num" id="LN309">309</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="310"><td class="num" id="LN310">310</td><td class="line"> <span class='keyword'>return</span> calc_sun_time(info, time(<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>));</td></tr> +<tr class="codeline" data-linenumber="311"><td class="num" id="LN311">311</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="312"><td class="num" id="LN312">312</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="313"><td class="num" id="LN313">313</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="314"><td class="num" id="LN314">314</td><td class="line"> <span class='comment'>* weather_info_next_sun_event:</span></td></tr> +<tr class="codeline" data-linenumber="315"><td class="num" id="LN315">315</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure</span></td></tr> +<tr class="codeline" data-linenumber="316"><td class="num" id="LN316">316</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="317"><td class="num" id="LN317">317</td><td class="line"> <span class='comment'>* Returns: the interval, in seconds, until the next "sun event":</span></td></tr> +<tr class="codeline" data-linenumber="318"><td class="num" id="LN318">318</td><td class="line"> <span class='comment'>* - local midnight, when rise and set times are recomputed</span></td></tr> +<tr class="codeline" data-linenumber="319"><td class="num" id="LN319">319</td><td class="line"> <span class='comment'>* - next sunrise, when icon changes to daytime version</span></td></tr> +<tr class="codeline" data-linenumber="320"><td class="num" id="LN320">320</td><td class="line"> <span class='comment'>* - next sunset, when icon changes to nighttime version</span></td></tr> +<tr class="codeline" data-linenumber="321"><td class="num" id="LN321">321</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="322"><td class="num" id="LN322">322</td><td class="line">gint</td></tr> +<tr class="codeline" data-linenumber="323"><td class="num" id="LN323">323</td><td class="line">weather_info_next_sun_event (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="324"><td class="num" id="LN324">324</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="325"><td class="num" id="LN325">325</td><td class="line"> time_t now = time (<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="326"><td class="num" id="LN326">326</td><td class="line"> <span class='keyword'>struct</span> tm ltm;</td></tr> +<tr class="codeline" data-linenumber="327"><td class="num" id="LN327">327</td><td class="line"> time_t nxtEvent;</td></tr> +<tr class="codeline" data-linenumber="328"><td class="num" id="LN328">328</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="329"><td class="num" id="LN329">329</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, -1)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_12<br>; if (info != ((void*)0)) _g_boolean_var_12 = 1; else _g_boolean_var_12<br> = 0; _g_boolean_var_12; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (-1); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="330"><td class="num" id="LN330">330</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="331"><td class="num" id="LN331">331</td><td class="line"> <span class='keyword'>if</span> (!calc_sun (info))</td></tr> +<tr class="codeline" data-linenumber="332"><td class="num" id="LN332">332</td><td class="line"> <span class='keyword'>return</span> -1;</td></tr> +<tr class="codeline" data-linenumber="333"><td class="num" id="LN333">333</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="334"><td class="num" id="LN334">334</td><td class="line"> <span class='comment'>/* Determine when the next local midnight occurs */</span></td></tr> +<tr class="codeline" data-linenumber="335"><td class="num" id="LN335">335</td><td class="line"> (<span class='keyword'>void</span>) localtime_r (&now, &ltm);</td></tr> +<tr class="codeline" data-linenumber="336"><td class="num" id="LN336">336</td><td class="line"> ltm.tm_sec = 0;</td></tr> +<tr class="codeline" data-linenumber="337"><td class="num" id="LN337">337</td><td class="line"> ltm.tm_min = 0;</td></tr> +<tr class="codeline" data-linenumber="338"><td class="num" id="LN338">338</td><td class="line"> ltm.tm_hour = 0;</td></tr> +<tr class="codeline" data-linenumber="339"><td class="num" id="LN339">339</td><td class="line"> ltm.tm_mday++;</td></tr> +<tr class="codeline" data-linenumber="340"><td class="num" id="LN340">340</td><td class="line"> nxtEvent = mktime (&ltm);</td></tr> +<tr class="codeline" data-linenumber="341"><td class="num" id="LN341">341</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="342"><td class="num" id="LN342">342</td><td class="line"> <span class='keyword'>if</span> (info->sunsetValid &&</td></tr> +<tr class="codeline" data-linenumber="343"><td class="num" id="LN343">343</td><td class="line"> (info->sunset > now) && (info->sunset < nxtEvent))</td></tr> +<tr class="codeline" data-linenumber="344"><td class="num" id="LN344">344</td><td class="line"> nxtEvent = info->sunset;</td></tr> +<tr class="codeline" data-linenumber="345"><td class="num" id="LN345">345</td><td class="line"> <span class='keyword'>if</span> (info->sunriseValid &&</td></tr> +<tr class="codeline" data-linenumber="346"><td class="num" id="LN346">346</td><td class="line"> (info->sunrise > now) && (info->sunrise < nxtEvent))</td></tr> +<tr class="codeline" data-linenumber="347"><td class="num" id="LN347">347</td><td class="line"> nxtEvent = info->sunrise;</td></tr> +<tr class="codeline" data-linenumber="348"><td class="num" id="LN348">348</td><td class="line"> <span class='keyword'>return</span> (gint)(nxtEvent - now);</td></tr> +<tr class="codeline" data-linenumber="349"><td class="num" id="LN349">349</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-20fe9d.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-20fe9d.html new file mode 100644 index 0000000..11befab --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-20fe9d.html @@ -0,0 +1,944 @@ +<!doctype html> +<html> +<head> +<title>weather-met.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Dereference of null pointer (loaded from variable 'o') --> + +<!-- BUGTYPE Dereference of null pointer --> + +<!-- BUGCATEGORY Logic error --> + +<!-- BUGFILE /rootdir/libmateweather/weather-met.c --> + +<!-- FILENAME weather-met.c --> + +<!-- FUNCTIONNAME met_reprocess --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 20fe9d2eaa69b09c60780bdfc3f8a920 --> + +<!-- BUGLINE 111 --> + +<!-- BUGCOLUMN 8 --> + +<!-- BUGPATHLENGTH 27 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather-met.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 111, column 8</a><br />Dereference of null pointer (loaded from variable 'o')</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather-met.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather-met.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"31": 1, "32": 1, "33": 1, "34": 1, "35": 1, "36": 1, "37": 1, "38": 1, "39": 1, "40": 1, "42": 1, "50": 1, "51": 1, "53": 1, "111": 1, "121": 1, "122": 1, "123": 1, "124": 1, "125": 1, "126": 1, "127": 1, "129": 1, "131": 1, "132": 1, "134": 1, "135": 1, "137": 1, "139": 1, "145": 1, "146": 1, "147": 1, "148": 1, "150": 1, "152": 1, "159": 1}, "6479": {"308": 1, "309": 1, "310": 1, "311": 1, "314": 1, "321": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + <path class="arrow" id="arrow0"/> + <path class="arrow" id="arrow1"/> + <path class="arrow" id="arrow2"/> + <path class="arrow" id="arrow3"/> + <path class="arrow" id="arrow4"/> + <path class="arrow" id="arrow5"/> + <path class="arrow" id="arrow6"/> + <path class="arrow" id="arrow7"/> + <path class="arrow" id="arrow8"/> + <path class="arrow" id="arrow9"/> + <path class="arrow" id="arrow10"/> + <path class="arrow" id="arrow11"/> + <path class="arrow" id="arrow12"/> + <path class="arrow" id="arrow13"/> + <path class="arrow" id="arrow14"/> + <path class="arrow" id="arrow15"/> + <path class="arrow" id="arrow16"/> + <path class="arrow" id="arrow17"/> + <path class="arrow" id="arrow18"/> + <path class="arrow" id="arrow19"/> + <path class="arrow" id="arrow20"/> + <path class="arrow" id="arrow21"/> + <path class="arrow" id="arrow22"/> + <path class="arrow" id="arrow23"/> + <path class="arrow" id="arrow24"/> + <path class="arrow" id="arrow25"/> + <path class="arrow" id="arrow26"/> + <path class="arrow" id="arrow27"/> + <path class="arrow" id="arrow28"/> + <path class="arrow" id="arrow29"/> + <path class="arrow" id="arrow30"/> + <path class="arrow" id="arrow31"/> + <path class="arrow" id="arrow32"/> + <path class="arrow" id="arrow33"/> + <path class="arrow" id="arrow34"/> + <path class="arrow" id="arrow35"/> + <path class="arrow" id="arrow36"/> + <path class="arrow" id="arrow37"/> + <path class="arrow" id="arrow38"/> + <path class="arrow" id="arrow39"/> + <path class="arrow" id="arrow40"/> + <path class="arrow" id="arrow41"/> + <path class="arrow" id="arrow42"/> + <path class="arrow" id="arrow43"/> + <path class="arrow" id="arrow44"/> + <path class="arrow" id="arrow45"/> + <path class="arrow" id="arrow46"/> + <path class="arrow" id="arrow47"/> + <path class="arrow" id="arrow48"/> + <path class="arrow" id="arrow49"/> + <path class="arrow" id="arrow50"/> + <path class="arrow" id="arrow51"/> + <path class="arrow" id="arrow52"/> + <path class="arrow" id="arrow53"/> + <path class="arrow" id="arrow54"/> + <path class="arrow" id="arrow55"/> + <path class="arrow" id="arrow56"/> + <path class="arrow" id="arrow57"/> + <path class="arrow" id="arrow58"/> + <path class="arrow" id="arrow59"/> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 60,57,55,50,48,47,46,44,43,38,36,32,32,28,26,22,22,18,16,13,13,11,9,7,5,4,2,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather-met.c - UK Met Office forecast source</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"><span class='directive'>#include <ctype.h></span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"><span class='directive'>#include <stdlib.h></span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"><span class='directive'>#include <string.h></span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#include "weather.h"</span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"><span id="start10"><span class='keyword'>static</span></span> <span class='keyword'>char</span> *</td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line">met_reprocess (<span class='keyword'>char</span> *x, <span class='keyword'>int</span> len)</td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> <span id="start9"><span id="end10"><span class='keyword'>char</span></span></span> *p = x;</td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"> <span class='keyword'>char</span> *o;</td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"> <span class='keyword'>int</span> spacing = 0;</td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> <span id="start8"><span class="mrange"><span id="end9"><span class='keyword'>static</span></span></span> gchar *buf</span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path22" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">22</div></td><td><div class="PathNav"><a href="#Path21" title="Previous event (21)">←</a></div></td><td>'buf' initialized to a null pointer value</td><td><div class="PathNav"><a href="#Path23" title="Next event (23)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"> <span class='keyword'>static</span> gint buflen = 0;</td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> gchar *lastspace = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"> <span class='keyword'>int</span> count = 0;</td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line"> <span id="start7"><span id="end8"><span class='keyword'>if</span></span></span> (<span id="start6"><span class="mrange"><span id="end7">buflen</span></span> < len</span>)</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path23" class="msg msgEvent" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">23</div></td><td><div class="PathNav"><a href="#Path22" title="Previous event (22)">←</a></div></td><td>Assuming 'buflen' is >= 'len'</td><td><div class="PathNav"><a href="#Path24" title="Next event (24)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path24" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">24</div></td><td><div class="PathNav"><a href="#Path23" title="Previous event (23)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path25" title="Next event (25)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"> <span class='keyword'>if</span> (buf)</td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line"> g_free (buf);</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line"> buf = g_malloc (len + 1);</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line"> buflen = len;</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> <span id="start3"><span class="mrange"><span id="end4"><span id="start5"><span id="end6">o</span></span></span></span> = <span id="start4"><span id="end5">buf</span></span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path25" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">25</div></td><td><div class="PathNav"><a href="#Path24" title="Previous event (24)">←</a></div></td><td>Null pointer value stored to 'o'</td><td><div class="PathNav"><a href="#Path26" title="Next event (26)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> x += len; <span class='comment'>/* End mark */</span></td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> <span id="start2"><span id="end3"><span class='keyword'>while</span></span></span> (<span id="start1"><span class="mrange"><span id="end2">*</span></span>p</span> && p < x) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path26" class="msg msgEvent" style="margin-left:12ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">26</div></td><td><div class="PathNav"><a href="#Path25" title="Previous event (25)">←</a></div></td><td>Assuming the condition is false</td><td><div class="PathNav"><a href="#EndPath" title="Next event (27)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>g_ascii_isspace (*p)<span class='macro_popup'>((g_ascii_table[(guchar) (*p)] & G_ASCII_SPACE) != 0)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> <span class='keyword'>if</span> (!spacing) {</td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> spacing = 1;</td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> lastspace = o;</td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> *o++ = ' ';</td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> p++;</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> spacing = 0;</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> <span class='keyword'>if</span> (count > 75 && lastspace) {</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> count = o - lastspace - 1;</td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> *lastspace = '\n';</td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"> lastspace = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='keyword'>if</span> (*p == '&') {</td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"> <span class='keyword'>if</span> (g_ascii_strncasecmp (p, <span class='string_literal'>"&amp;"</span>, 5) == 0) {</td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line"> *o++ = '&';</td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line"> p += 5;</td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> <span class='keyword'>if</span> (g_ascii_strncasecmp (p, <span class='string_literal'>"&lt;"</span>, 4) == 0) {</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> *o++ = '<';</td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> p += 4;</td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line"> <span class='keyword'>if</span> (g_ascii_strncasecmp (p, <span class='string_literal'>"&gt;"</span>, 4) == 0) {</td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line"> *o++ = '>';</td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"> p += 4;</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line"> <span class='keyword'>if</span> (*p == '<') {</td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> <span class='keyword'>if</span> (g_ascii_strncasecmp (p, <span class='string_literal'>"<BR>"</span>, 4) == 0) {</td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"> *o++ = '\n';</td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> count = 0;</td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> <span class='keyword'>if</span> (g_ascii_strncasecmp (p, <span class='string_literal'>"<B>"</span>, 3) == 0) {</td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> *o++ = '\n';</td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"> *o++ = '\n';</td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line"> count = 0;</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> p++;</td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line"> <span class='keyword'>while</span> (*p && *p != '>')</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> p++;</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> <span class='keyword'>if</span> (*p)</td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> p++;</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> <span class='keyword'>continue</span>;</td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> *o++ = *p++;</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> count++;</td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> <span id="start0"><span id="end1">*</span></span><span class="mrange">o</span> <span id="end0">=</span> 0;</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:8ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">27</div></td><td><div class="PathNav"><a href="#Path26" title="Previous event (26)">←</a></div></td><td>Dereference of null pointer (loaded from variable 'o')</td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line"> <span class='comment'>* Parse the metoffice forecast info.</span></td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> <span class='comment'>* For mate 3.0 we want to just embed an HTML matecomponent component and</span></td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line"> <span class='comment'>* be done with this ;)</span></td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line"><span id="start42"><span class='keyword'>static</span></span> gchar *</td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line">met_parse (<span class='keyword'>const</span> gchar *meto)</td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line"> <span id="start41"><span id="end42">gchar</span></span> *p;</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> gchar *rp;</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line"> gchar *r = <span class='macro'>g_strdup (<span class='string_literal'>"Met Office Forecast\n"</span>)<span class='macro_popup'>g_strdup_inline ("Met Office Forecast\n")</span></span>;</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line"> <span id="start40"><span id="end41">gchar</span></span> *t;</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> <span id="start33"><span id="start34"><span id="end34"><span id="start35"><span id="end35"><span id="start36"><span id="end36"><span id="start37"><span id="end37"><span class="mrange"><span id="start38"><span id="end38"><span id="start39"><span id="end39"><span id="end40"><span class='macro'>g_return_val_if_fail</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> (meto != NULL, r)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_14<br>; if (meto != ((void*)0)) _g_boolean_var_14 = 1; else _g_boolean_var_14<br> = 0; _g_boolean_var_14; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "meto != NULL");<br> return (r); } } while (0)</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path9" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">9</div></td><td><div class="PathNav"><a href="#Path8" title="Previous event (8)">←</a></div></td><td>Assuming 'meto' is not equal to null</td><td><div class="PathNav"><a href="#Path10" title="Next event (10)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path10" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">10</div></td><td><div class="PathNav"><a href="#Path9" title="Previous event (9)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path11" title="Next event (11)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path11" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">11</div></td><td><div class="PathNav"><a href="#Path10" title="Previous event (10)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path12" title="Next event (12)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path12" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">12</div></td><td><div class="PathNav"><a href="#Path11" title="Previous event (11)">←</a></div></td><td>Loop condition is false. Exiting loop</td><td><div class="PathNav"><a href="#Path13" title="Next event (13)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> <span id="start30"><span id="end31"><span id="start32"><span id="end33">p</span></span></span></span> = strstr (<span id="start31"><span id="end32">meto</span></span>, <span class='string_literal'>"Summary: </b>"</span>);</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> <span id="start23"><span id="start24"><span id="end24"><span id="start25"><span id="end25"><span id="start26"><span id="end26"><span id="start27"><span id="end27"><span class="mrange"><span id="start28"><span id="end28"><span id="start29"><span id="end29"><span id="end30"><span class='macro'>g_return_val_if_fail</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> (p != NULL, r)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_15<br>; if (p != ((void*)0)) _g_boolean_var_15 = 1; else _g_boolean_var_15<br> = 0; _g_boolean_var_15; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "p != NULL"); return<br> (r); } } while (0)</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path13" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">13</div></td><td><div class="PathNav"><a href="#Path12" title="Previous event (12)">←</a></div></td><td>Assuming 'p' is not equal to null</td><td><div class="PathNav"><a href="#Path14" title="Next event (14)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path14" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">14</div></td><td><div class="PathNav"><a href="#Path13" title="Previous event (13)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path15" title="Next event (15)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path15" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">15</div></td><td><div class="PathNav"><a href="#Path14" title="Previous event (14)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path16" title="Next event (16)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path16" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">16</div></td><td><div class="PathNav"><a href="#Path15" title="Previous event (15)">←</a></div></td><td>Loop condition is false. Exiting loop</td><td><div class="PathNav"><a href="#Path17" title="Next event (17)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> <span id="start20"><span id="end21"><span id="start22"><span id="end23">rp</span></span></span></span> = strstr (<span id="start21"><span id="end22">p</span></span>, <span class='string_literal'>"Text issued at:"</span>);</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> <span id="start13"><span id="start14"><span id="end14"><span id="start15"><span id="end15"><span id="start16"><span id="end16"><span id="start17"><span id="end17"><span class="mrange"><span id="start18"><span id="end18"><span id="start19"><span id="end19"><span id="end20"><span class='macro'>g_return_val_if_fail</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> (rp != NULL, r)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_16<br>; if (rp != ((void*)0)) _g_boolean_var_16 = 1; else _g_boolean_var_16<br> = 0; _g_boolean_var_16; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "rp != NULL"); return<br> (r); } } while (0)</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path17" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">17</div></td><td><div class="PathNav"><a href="#Path16" title="Previous event (16)">←</a></div></td><td>Assuming 'rp' is not equal to null</td><td><div class="PathNav"><a href="#Path18" title="Next event (18)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path18" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">18</div></td><td><div class="PathNav"><a href="#Path17" title="Previous event (17)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path19" title="Next event (19)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path19" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">19</div></td><td><div class="PathNav"><a href="#Path18" title="Previous event (18)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path20" title="Next event (20)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path20" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">20</div></td><td><div class="PathNav"><a href="#Path19" title="Previous event (19)">←</a></div></td><td>Loop condition is false. Exiting loop</td><td><div class="PathNav"><a href="#Path21" title="Next event (21)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> <span id="start12"><span id="end13">p</span></span> += 13;</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> <span class='comment'>/* p to rp is the text block we want but in HTML malformat */</span></td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> <span id="start11"><span id="end12">t</span></span> = g_strconcat (r, <span class="mrange"><span id="end11">met_reprocess</span> (p, rp - p)</span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path21" class="msg msgEvent" style="margin-left:25ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">21</div></td><td><div class="PathNav"><a href="#Path20" title="Previous event (20)">←</a></div></td><td>Calling 'met_reprocess'</td><td><div class="PathNav"><a href="#Path22" title="Next event (22)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> g_free (r);</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> <span class='keyword'>return</span> t;</td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line">met_finish (SoupSession *session, SoupMessage *msg, gpointer data)</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> <span id="start59">WeatherInfo</span> *info = (WeatherInfo *)data;</td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line"> <span id="start49"><span id="start52"><span id="start53"><span id="end53"><span id="start54"><span id="end54"><span id="start55"><span id="end55"><span id="start56"><span id="end56"><span class="mrange"><span id="start57"><span id="end57"><span id="start58"><span id="end58"><span id="end59"><span class='macro'>g_return_if_fail</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span></span> (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_17<br>; if (info != ((void*)0)) _g_boolean_var_17 = 1; else _g_boolean_var_17<br> = 0; _g_boolean_var_17; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path1" class="msg msgEvent" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">1</div></td><td>Assuming 'info' is not equal to null</td><td><div class="PathNav"><a href="#Path2" title="Next event (2)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path2" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">2</div></td><td><div class="PathNav"><a href="#Path1" title="Previous event (1)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path3" title="Next event (3)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path3" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">3</div></td><td><div class="PathNav"><a href="#Path2" title="Previous event (2)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path4" title="Next event (4)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> <span id="start48"><span id="end49"><span id="start51"><span id="end52"><span class='keyword'>if</span></span></span></span></span> (!<span id="start45"><span class="mrange"><span id="start46"><span id="end46"><span class="mrange"><span id="start47"><span id="end47"><span id="end48"><span id="start50"><span id="end50"><span id="end51"><span class='macro'>SOUP_STATUS_IS_SUCCESSFUL</span></span></span></span></span></span></span></span></span></span></span> (msg->status_code)<span class='macro_popup'>((msg->status_code) >= 200 && (msg->status_code<br>) < 300)</span></span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path4" class="msg msgControl" style="margin-left:10ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">4</div></td><td><div class="PathNav"><a href="#Path3" title="Previous event (3)">←</a></div></td><td>Loop condition is false. Exiting loop</td><td><div class="PathNav"><a href="#Path5" title="Next event (5)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path5" class="msg msgEvent" style="margin-left:10ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">5</div></td><td><div class="PathNav"><a href="#Path4" title="Previous event (4)">←</a></div></td><td>Assuming field 'status_code' is >= 200</td><td><div class="PathNav"><a href="#Path6" title="Next event (6)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path6" class="msg msgEvent" style="margin-left:10ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">6</div></td><td><div class="PathNav"><a href="#Path5" title="Previous event (5)">←</a></div></td><td>Assuming field 'status_code' is < 300</td><td><div class="PathNav"><a href="#Path7" title="Next event (7)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path7" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">7</div></td><td><div class="PathNav"><a href="#Path6" title="Previous event (6)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path8" title="Next event (8)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> g_warning (<span class='string_literal'>"Failed to get Met Office forecast data: %d %s.\n"</span>,</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> msg->status_code, msg->reason_phrase);</td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> request_done (info, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"> <span id="start44"><span id="end45">info</span></span>->forecast = <span class="mrange"><span id="end43">met_parse</span> (<span id="start43"><span id="end44">msg</span></span>->response_body->data)</span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path8" class="msg msgEvent" style="margin-left:22ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">8</div></td><td><div class="PathNav"><a href="#Path7" title="Previous event (7)">←</a></div></td><td>Calling 'met_parse'</td><td><div class="PathNav"><a href="#Path9" title="Next event (9)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line"> request_done (info, <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line">metoffice_start_open (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> gchar *url;</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> SoupMessage *msg;</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> WeatherLocation *loc;</td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> loc = info->location;</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> url = g_strdup_printf (<span class='string_literal'>"http://www.metoffice.gov.uk/weather/europe/uk/%s.html"</span>, loc->zone + 1);</td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> msg = soup_message_new (<span class='string_literal'>"GET"</span>, url);</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> soup_session_queue_message (info->session, msg, met_finish, info);</td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> g_free (url);</td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> info->requests_pending++;</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-339c98.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-339c98.html new file mode 100644 index 0000000..6013ad4 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-339c98.html @@ -0,0 +1,1029 @@ +<!doctype html> +<html> +<head> +<title>weather-sun.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Value stored to 'obsLat' during its initialization is never read --> + +<!-- BUGTYPE Dead initialization --> + +<!-- BUGCATEGORY Unused code --> + +<!-- BUGFILE /rootdir/libmateweather/weather-sun.c --> + +<!-- FILENAME weather-sun.c --> + +<!-- FUNCTIONNAME calc_sun2 --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 339c98a3d625369d3fd9c005bf20c8aa --> + +<!-- BUGLINE 162 --> + +<!-- BUGCOLUMN 13 --> + +<!-- BUGPATHLENGTH 1 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather-sun.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 162, column 13</a><br />Value stored to 'obsLat' during its initialization is never read</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather-sun.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather-sun.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"162": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather-sun.c - Astronomy calculations for mateweather</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"> <span class='comment'>* Formulas from:</span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"> <span class='comment'>* "Practical Astronomy With Your Calculator" (3e), Peter Duffett-Smith</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> <span class='comment'>* Cambridge University Press 1988</span></td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"> <span class='comment'>* Unless otherwise noted, comments referencing "steps" are related to</span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"> <span class='comment'>* the algorithm presented in section 49 of above</span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"><span class='directive'>#include <math.h></span></td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"><span class='directive'>#include <time.h></span></td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"><span class='directive'>#include <glib.h></span></td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"><span class='directive'>#define <span class='macro'>ECCENTRICITY(d)<span class='macro_popup'>(0.01671123 - (d)/36525.*0.00004392)</span></span> (0.01671123 - (d)/36525.*0.00004392)</span></td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> <span class='comment'>* Ecliptic longitude of the sun at specified time (UT)</span></td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line"> <span class='comment'>* The algoithm is described in section 47 of Duffett-Smith</span></td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> <span class='comment'>* Return value is in radians</span></td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line">gdouble</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line">sunEclipLongitude(time_t t)</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> gdouble ndays, meanAnom, eccenAnom, delta, e, longitude;</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> <span class='comment'>* Start with an estimate based on a fixed daily rate</span></td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> ndays = <span class='macro'>EPOCH_TO_J2000(t)<span class='macro_popup'>((gdouble)(t)-946727935.816)</span></span> / 86400.;</td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> meanAnom = <span class='macro'>DEGREES_TO_RADIANS(MEAN_ECLIPTIC_LONGITUDE(ndays)<span class='macro_popup'>((fmod (((280.46457166 + (ndays)/36525.*35999.37244981) - (282.93768193<br> + (ndays)/36525.*0.32327364)),360.) / 180.) * 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> <span class='macro'>- PERIGEE_LONGITUDE(ndays))<span class='macro_popup'>((fmod (((280.46457166 + (ndays)/36525.*35999.37244981) - (282.93768193<br> + (ndays)/36525.*0.32327364)),360.) / 180.) * 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> <span class='comment'>* Approximate solution of Kepler's equation:</span></td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> <span class='comment'>* Find E which satisfies E - e sin(E) = M (mean anomaly)</span></td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> eccenAnom = meanAnom;</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> e = <span class='macro'>ECCENTRICITY(ndays)<span class='macro_popup'>(0.01671123 - (ndays)/36525.*0.00004392)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> <span class='keyword'>while</span> (1e-12 < fabs( delta = eccenAnom - e * sin(eccenAnom) - meanAnom))</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> eccenAnom -= delta / (1.- e * cos(eccenAnom));</td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"> <span class='comment'>* Earth's longitude on the ecliptic</span></td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"> longitude = fmod( <span class='macro'>DEGREES_TO_RADIANS (PERIGEE_LONGITUDE(ndays))<span class='macro_popup'>((fmod (((282.93768193 + (ndays)/36525.*0.32327364)),360.) / 180.<br>) * 3.14159265358979323846)</span></span></td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line"> + 2. * atan (sqrt ((1.+e)/(1.-e))</td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"> * tan (eccenAnom / 2.)),</td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line"> 2. * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>);</td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line"> <span class='keyword'>if</span> (longitude < 0.) {</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line"> longitude += 2 * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>;</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> <span class='keyword'>return</span> longitude;</td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line"><span class='keyword'>static</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line">ecliptic_obliquity (gdouble time)</td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line"> gdouble jc = <span class='macro'>EPOCH_TO_J2000 (time)<span class='macro_popup'>((gdouble)(time)-946727935.816)</span></span> / (36525. * 86400.);</td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line"> gdouble eclip_secs = (84381.448</td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"> - (46.84024 * jc)</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line"> - (59.e-5 * jc * jc)</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line"> + (1.813e-3 * jc * jc * jc));</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DEGREES_TO_RADIANS(eclip_secs / 3600.)<span class='macro_popup'>((fmod ((eclip_secs / 3600.),360.) / 180.) * 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> <span class='comment'>* Convert ecliptic longitude and latitude (radians) to equitorial</span></td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> <span class='comment'>* coordinates, expressed as right ascension (hours) and</span></td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> <span class='comment'>* declination (radians)</span></td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line">ecl2equ (gdouble time,</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> gdouble eclipLon, gdouble eclipLat,</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> gdouble *ra, gdouble *decl)</td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> gdouble mEclipObliq = ecliptic_obliquity(time);</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> <span class='keyword'>if</span> (ra) {</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> *ra = <span class='macro'>RADIANS_TO_HOURS (atan2 ((sin (eclipLon) * cos (mEclipObliq)<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> <span class='macro'>- tan (eclipLat) * sin(mEclipObliq)),<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> <span class='macro'>cos (eclipLon)))<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> <span class='keyword'>if</span> (*ra < 0.)</td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> *ra += 24.;</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> <span class='keyword'>if</span> (decl) {</td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line"> *decl = asin (( sin (eclipLat) * cos (mEclipObliq))</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> + cos (eclipLat) * sin (mEclipObliq) * sin(eclipLon));</td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> <span class='comment'>* Calculate rising and setting times for an object</span></td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line"> <span class='comment'>* based on it equitorial coordinates (section 33 & 15)</span></td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line"> <span class='comment'>* Returned "rise" and "set" values are sideral times in hours</span></td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line">gstObsv (gdouble ra, gdouble decl,</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> gdouble obsLat, gdouble obsLon,</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line"> gdouble *rise, gdouble *set)</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> <span class='keyword'>double</span> a = acos (-tan (obsLat) * tan (decl));</td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> <span class='keyword'>double</span> b;</td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>isnan (a)<span class='macro_popup'>__builtin_isnan (a)</span></span> != 0) {</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> *set = *rise = a;</td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> a = <span class='macro'>RADIANS_TO_HOURS (a)<span class='macro_popup'>((a) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> b = 24. - a + ra;</td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> a += ra;</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> a -= <span class='macro'>RADIANS_TO_HOURS (obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> b -= <span class='macro'>RADIANS_TO_HOURS (obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> <span class='keyword'>if</span> ((a = fmod (a, 24.)) < 0)</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> a += 24.;</td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> <span class='keyword'>if</span> ((b = fmod (b, 24.)) < 0)</td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line"> b += 24.;</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"> *set = a;</td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line"> *rise = b;</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"><span class='keyword'>static</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line">t0 (time_t date)</td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> gdouble t = ((gdouble)(<span class='macro'>EPOCH_TO_J2000 (date)<span class='macro_popup'>((gdouble)(date)-946727935.816)</span></span> / 86400)) / 36525.0;</td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> gdouble t0 = fmod (6.697374558 + 2400.051366 * t + 2.5862e-5 * t * t, 24.);</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> <span class='keyword'>if</span> (t0 < 0.)</td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> t0 += 24.;</td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> <span class='keyword'>return</span> t0;</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line">calc_sun2 (WeatherInfo *info, time_t t)</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> gdouble <span class="mrange">obsLat</span> = <span class="mrange">info->location->latitude</span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:13ex">Value stored to 'obsLat' during its initialization is never read</div></td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"> gdouble obsLon = info->location->longitude;</td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line"> time_t gm_midn;</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line"> time_t lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> gdouble gm_hoff, lambda;</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> gdouble ra1, ra2;</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> gdouble decl1, decl2;</td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> gdouble decl_midn, decl_noon;</td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> gdouble rise1, rise2;</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> gdouble set1, set2;</td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> gdouble tt, t00;</td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> gdouble x, u, dt;</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> <span class='comment'>/* Approximate preceding local midnight at observer's longitude */</span></td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> obsLat = info->location->latitude;</td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> obsLon = info->location->longitude;</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line"> gm_midn = t - (t % 86400);</td></tr> +<tr class="codeline" data-linenumber="179"><td class="num" id="LN179">179</td><td class="line"> gm_hoff = floor ((<span class='macro'>RADIANS_TO_DEGREES (obsLon)<span class='macro_popup'>((obsLon) * 180. / 3.14159265358979323846)</span></span> + 7.5) / 15.);</td></tr> +<tr class="codeline" data-linenumber="180"><td class="num" id="LN180">180</td><td class="line"> lcl_midn = gm_midn - 3600. * gm_hoff;</td></tr> +<tr class="codeline" data-linenumber="181"><td class="num" id="LN181">181</td><td class="line"> <span class='keyword'>if</span> (t - lcl_midn >= 86400)</td></tr> +<tr class="codeline" data-linenumber="182"><td class="num" id="LN182">182</td><td class="line"> lcl_midn += 86400;</td></tr> +<tr class="codeline" data-linenumber="183"><td class="num" id="LN183">183</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (lcl_midn > t)</td></tr> +<tr class="codeline" data-linenumber="184"><td class="num" id="LN184">184</td><td class="line"> lcl_midn -= 86400;</td></tr> +<tr class="codeline" data-linenumber="185"><td class="num" id="LN185">185</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="186"><td class="num" id="LN186">186</td><td class="line"> lambda = sunEclipLongitude (lcl_midn);</td></tr> +<tr class="codeline" data-linenumber="187"><td class="num" id="LN187">187</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="188"><td class="num" id="LN188">188</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="189"><td class="num" id="LN189">189</td><td class="line"> <span class='comment'>* Calculate equitorial coordinates of sun at previous</span></td></tr> +<tr class="codeline" data-linenumber="190"><td class="num" id="LN190">190</td><td class="line"> <span class='comment'>* and next local midnights</span></td></tr> +<tr class="codeline" data-linenumber="191"><td class="num" id="LN191">191</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="192"><td class="num" id="LN192">192</td><td class="line"> ecl2equ (lcl_midn, lambda, 0., &ra1, &decl1);</td></tr> +<tr class="codeline" data-linenumber="193"><td class="num" id="LN193">193</td><td class="line"> ecl2equ (lcl_midn + 86400.,</td></tr> +<tr class="codeline" data-linenumber="194"><td class="num" id="LN194">194</td><td class="line"> lambda + <span class='macro'>DEGREES_TO_RADIANS(SOL_PROGRESSION)<span class='macro_popup'>((fmod (((360./365.242191)),360.) / 180.) * 3.14159265358979323846<br>)</span></span>, 0.,</td></tr> +<tr class="codeline" data-linenumber="195"><td class="num" id="LN195">195</td><td class="line"> &ra2, &decl2);</td></tr> +<tr class="codeline" data-linenumber="196"><td class="num" id="LN196">196</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="197"><td class="num" id="LN197">197</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="198"><td class="num" id="LN198">198</td><td class="line"> <span class='comment'>* If the observer is within the Arctic or Antarctic Circles then</span></td></tr> +<tr class="codeline" data-linenumber="199"><td class="num" id="LN199">199</td><td class="line"> <span class='comment'>* the sun may be above or below the horizon for the full day.</span></td></tr> +<tr class="codeline" data-linenumber="200"><td class="num" id="LN200">200</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="201"><td class="num" id="LN201">201</td><td class="line"> decl_midn = <span class='macro'>MIN(decl1,decl2)<span class='macro_popup'>(((decl1) < (decl2)) ? (decl1) : (decl2))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="202"><td class="num" id="LN202">202</td><td class="line"> decl_noon = (decl1+decl2)/2.;</td></tr> +<tr class="codeline" data-linenumber="203"><td class="num" id="LN203">203</td><td class="line"> info->midnightSun =</td></tr> +<tr class="codeline" data-linenumber="204"><td class="num" id="LN204">204</td><td class="line"> (obsLat > (<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.-decl_midn)) || (obsLat < (-<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.-decl_midn));</td></tr> +<tr class="codeline" data-linenumber="205"><td class="num" id="LN205">205</td><td class="line"> info->polarNight =</td></tr> +<tr class="codeline" data-linenumber="206"><td class="num" id="LN206">206</td><td class="line"> (obsLat > (<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.+decl_noon)) || (obsLat < (-<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.+decl_noon));</td></tr> +<tr class="codeline" data-linenumber="207"><td class="num" id="LN207">207</td><td class="line"> <span class='keyword'>if</span> (info->midnightSun || info->polarNight) {</td></tr> +<tr class="codeline" data-linenumber="208"><td class="num" id="LN208">208</td><td class="line"> info->sunriseValid = info->sunsetValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="209"><td class="num" id="LN209">209</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="210"><td class="num" id="LN210">210</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="211"><td class="num" id="LN211">211</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="212"><td class="num" id="LN212">212</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="213"><td class="num" id="LN213">213</td><td class="line"> <span class='comment'>* Convert to rise and set times based positions for the preceding</span></td></tr> +<tr class="codeline" data-linenumber="214"><td class="num" id="LN214">214</td><td class="line"> <span class='comment'>* and following local midnights.</span></td></tr> +<tr class="codeline" data-linenumber="215"><td class="num" id="LN215">215</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="216"><td class="num" id="LN216">216</td><td class="line"> gstObsv (ra1, decl1, obsLat, obsLon - (gm_hoff * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span> / 12.), &rise1, &set1);</td></tr> +<tr class="codeline" data-linenumber="217"><td class="num" id="LN217">217</td><td class="line"> gstObsv (ra2, decl2, obsLat, obsLon - (gm_hoff * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span> / 12.), &rise2, &set2);</td></tr> +<tr class="codeline" data-linenumber="218"><td class="num" id="LN218">218</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="219"><td class="num" id="LN219">219</td><td class="line"> <span class='comment'>/* TODO: include calculations for regions near the poles. */</span></td></tr> +<tr class="codeline" data-linenumber="220"><td class="num" id="LN220">220</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>isnan(rise1)<span class='macro_popup'>__builtin_isnan (rise1)</span></span> || <span class='macro'>isnan(rise2)<span class='macro_popup'>__builtin_isnan (rise2)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="221"><td class="num" id="LN221">221</td><td class="line"> info->sunriseValid = info->sunsetValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="222"><td class="num" id="LN222">222</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="223"><td class="num" id="LN223">223</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="224"><td class="num" id="LN224">224</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="225"><td class="num" id="LN225">225</td><td class="line"> <span class='keyword'>if</span> (rise2 < rise1) {</td></tr> +<tr class="codeline" data-linenumber="226"><td class="num" id="LN226">226</td><td class="line"> rise2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="227"><td class="num" id="LN227">227</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="228"><td class="num" id="LN228">228</td><td class="line"> <span class='keyword'>if</span> (set2 < set1) {</td></tr> +<tr class="codeline" data-linenumber="229"><td class="num" id="LN229">229</td><td class="line"> set2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="230"><td class="num" id="LN230">230</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="231"><td class="num" id="LN231">231</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="232"><td class="num" id="LN232">232</td><td class="line"> tt = t0(lcl_midn);</td></tr> +<tr class="codeline" data-linenumber="233"><td class="num" id="LN233">233</td><td class="line"> t00 = tt - (gm_hoff + <span class='macro'>RADIANS_TO_HOURS(obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>) * 1.002737909;</td></tr> +<tr class="codeline" data-linenumber="234"><td class="num" id="LN234">234</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="235"><td class="num" id="LN235">235</td><td class="line"> <span class='keyword'>if</span> (t00 < 0.)</td></tr> +<tr class="codeline" data-linenumber="236"><td class="num" id="LN236">236</td><td class="line"> t00 += 24.;</td></tr> +<tr class="codeline" data-linenumber="237"><td class="num" id="LN237">237</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="238"><td class="num" id="LN238">238</td><td class="line"> <span class='keyword'>if</span> (rise1 < t00) {</td></tr> +<tr class="codeline" data-linenumber="239"><td class="num" id="LN239">239</td><td class="line"> rise1 += 24.;</td></tr> +<tr class="codeline" data-linenumber="240"><td class="num" id="LN240">240</td><td class="line"> rise2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="241"><td class="num" id="LN241">241</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="242"><td class="num" id="LN242">242</td><td class="line"> <span class='keyword'>if</span> (set1 < t00) {</td></tr> +<tr class="codeline" data-linenumber="243"><td class="num" id="LN243">243</td><td class="line"> set1 += 24.;</td></tr> +<tr class="codeline" data-linenumber="244"><td class="num" id="LN244">244</td><td class="line"> set2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="245"><td class="num" id="LN245">245</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="246"><td class="num" id="LN246">246</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="247"><td class="num" id="LN247">247</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="248"><td class="num" id="LN248">248</td><td class="line"> <span class='comment'>* Interpolate between the two to get a rise and set time</span></td></tr> +<tr class="codeline" data-linenumber="249"><td class="num" id="LN249">249</td><td class="line"> <span class='comment'>* based on the sun's position at local noon (step 8)</span></td></tr> +<tr class="codeline" data-linenumber="250"><td class="num" id="LN250">250</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="251"><td class="num" id="LN251">251</td><td class="line"> rise1 = (24.07 * rise1 - t00 * (rise2 - rise1)) / (24.07 + rise1 - rise2);</td></tr> +<tr class="codeline" data-linenumber="252"><td class="num" id="LN252">252</td><td class="line"> set1 = (24.07 * set1 - t00 * (set2 - set1)) / (24.07 + set1 - set2);</td></tr> +<tr class="codeline" data-linenumber="253"><td class="num" id="LN253">253</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="254"><td class="num" id="LN254">254</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="255"><td class="num" id="LN255">255</td><td class="line"> <span class='comment'>* Calculate an adjustment value to account for parallax,</span></td></tr> +<tr class="codeline" data-linenumber="256"><td class="num" id="LN256">256</td><td class="line"> <span class='comment'>* refraction and the Sun's finite diameter (steps 9,10)</span></td></tr> +<tr class="codeline" data-linenumber="257"><td class="num" id="LN257">257</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="258"><td class="num" id="LN258">258</td><td class="line"> decl2 = (decl1 + decl2) / 2.;</td></tr> +<tr class="codeline" data-linenumber="259"><td class="num" id="LN259">259</td><td class="line"> x = <span class='macro'>DEGREES_TO_RADIANS(0.830725)<span class='macro_popup'>((fmod ((0.830725),360.) / 180.) * 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="260"><td class="num" id="LN260">260</td><td class="line"> u = acos ( sin(obsLat) / cos(decl2) );</td></tr> +<tr class="codeline" data-linenumber="261"><td class="num" id="LN261">261</td><td class="line"> dt = <span class='macro'>RADIANS_TO_HOURS ( asin ( sin(x) / sin(u) ) / cos(decl2) )<span class='macro_popup'>((asin ( sin(x) / sin(u) ) / cos(decl2)) * 12. / 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="262"><td class="num" id="LN262">262</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="263"><td class="num" id="LN263">263</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="264"><td class="num" id="LN264">264</td><td class="line"> <span class='comment'>* Subtract the correction value from sunrise and add to sunset,</span></td></tr> +<tr class="codeline" data-linenumber="265"><td class="num" id="LN265">265</td><td class="line"> <span class='comment'>* then (step 11) convert sideral times to UT</span></td></tr> +<tr class="codeline" data-linenumber="266"><td class="num" id="LN266">266</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="267"><td class="num" id="LN267">267</td><td class="line"> rise1 = (rise1 - dt - tt) * 0.9972695661;</td></tr> +<tr class="codeline" data-linenumber="268"><td class="num" id="LN268">268</td><td class="line"> <span class='keyword'>if</span> (rise1 < 0.)</td></tr> +<tr class="codeline" data-linenumber="269"><td class="num" id="LN269">269</td><td class="line"> rise1 += 24;</td></tr> +<tr class="codeline" data-linenumber="270"><td class="num" id="LN270">270</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (rise1 >= 24.)</td></tr> +<tr class="codeline" data-linenumber="271"><td class="num" id="LN271">271</td><td class="line"> rise1 -= 24.;</td></tr> +<tr class="codeline" data-linenumber="272"><td class="num" id="LN272">272</td><td class="line"> info->sunriseValid = ((rise1 >= 0.) && (rise1 < 24.));</td></tr> +<tr class="codeline" data-linenumber="273"><td class="num" id="LN273">273</td><td class="line"> info->sunrise = (rise1 * 3600.) + lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="274"><td class="num" id="LN274">274</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="275"><td class="num" id="LN275">275</td><td class="line"> set1 = (set1 + dt - tt) * 0.9972695661;</td></tr> +<tr class="codeline" data-linenumber="276"><td class="num" id="LN276">276</td><td class="line"> <span class='keyword'>if</span> (set1 < 0.)</td></tr> +<tr class="codeline" data-linenumber="277"><td class="num" id="LN277">277</td><td class="line"> set1 += 24;</td></tr> +<tr class="codeline" data-linenumber="278"><td class="num" id="LN278">278</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (set1 >= 24.)</td></tr> +<tr class="codeline" data-linenumber="279"><td class="num" id="LN279">279</td><td class="line"> set1 -= 24.;</td></tr> +<tr class="codeline" data-linenumber="280"><td class="num" id="LN280">280</td><td class="line"> info->sunsetValid = ((set1 >= 0.) && (set1 < 24.));</td></tr> +<tr class="codeline" data-linenumber="281"><td class="num" id="LN281">281</td><td class="line"> info->sunset = (set1 * 3600.) + lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="282"><td class="num" id="LN282">282</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="283"><td class="num" id="LN283">283</td><td class="line"> <span class='keyword'>return</span> (info->sunriseValid || info->sunsetValid);</td></tr> +<tr class="codeline" data-linenumber="284"><td class="num" id="LN284">284</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="285"><td class="num" id="LN285">285</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="286"><td class="num" id="LN286">286</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="287"><td class="num" id="LN287">287</td><td class="line"> <span class='comment'>* calc_sun_time:</span></td></tr> +<tr class="codeline" data-linenumber="288"><td class="num" id="LN288">288</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure containing the observer's latitude</span></td></tr> +<tr class="codeline" data-linenumber="289"><td class="num" id="LN289">289</td><td class="line"> <span class='comment'>* and longitude in radians, fills in the sunrise and sunset times.</span></td></tr> +<tr class="codeline" data-linenumber="290"><td class="num" id="LN290">290</td><td class="line"> <span class='comment'>* @t: time_t</span></td></tr> +<tr class="codeline" data-linenumber="291"><td class="num" id="LN291">291</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="292"><td class="num" id="LN292">292</td><td class="line"> <span class='comment'>* Returns: gboolean indicating if the results are valid.</span></td></tr> +<tr class="codeline" data-linenumber="293"><td class="num" id="LN293">293</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="294"><td class="num" id="LN294">294</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="295"><td class="num" id="LN295">295</td><td class="line">calc_sun_time (WeatherInfo *info, time_t t)</td></tr> +<tr class="codeline" data-linenumber="296"><td class="num" id="LN296">296</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="297"><td class="num" id="LN297">297</td><td class="line"> <span class='keyword'>return</span> info->location->latlon_valid && calc_sun2 (info, t);</td></tr> +<tr class="codeline" data-linenumber="298"><td class="num" id="LN298">298</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="299"><td class="num" id="LN299">299</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="300"><td class="num" id="LN300">300</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="301"><td class="num" id="LN301">301</td><td class="line"> <span class='comment'>* calc_sun:</span></td></tr> +<tr class="codeline" data-linenumber="302"><td class="num" id="LN302">302</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure containing the observer's latitude</span></td></tr> +<tr class="codeline" data-linenumber="303"><td class="num" id="LN303">303</td><td class="line"> <span class='comment'>* and longitude in radians, fills in the sunrise and sunset times.</span></td></tr> +<tr class="codeline" data-linenumber="304"><td class="num" id="LN304">304</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="305"><td class="num" id="LN305">305</td><td class="line"> <span class='comment'>* Returns: gboolean indicating if the results are valid.</span></td></tr> +<tr class="codeline" data-linenumber="306"><td class="num" id="LN306">306</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="307"><td class="num" id="LN307">307</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="308"><td class="num" id="LN308">308</td><td class="line">calc_sun (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="309"><td class="num" id="LN309">309</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="310"><td class="num" id="LN310">310</td><td class="line"> <span class='keyword'>return</span> calc_sun_time(info, time(<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>));</td></tr> +<tr class="codeline" data-linenumber="311"><td class="num" id="LN311">311</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="312"><td class="num" id="LN312">312</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="313"><td class="num" id="LN313">313</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="314"><td class="num" id="LN314">314</td><td class="line"> <span class='comment'>* weather_info_next_sun_event:</span></td></tr> +<tr class="codeline" data-linenumber="315"><td class="num" id="LN315">315</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure</span></td></tr> +<tr class="codeline" data-linenumber="316"><td class="num" id="LN316">316</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="317"><td class="num" id="LN317">317</td><td class="line"> <span class='comment'>* Returns: the interval, in seconds, until the next "sun event":</span></td></tr> +<tr class="codeline" data-linenumber="318"><td class="num" id="LN318">318</td><td class="line"> <span class='comment'>* - local midnight, when rise and set times are recomputed</span></td></tr> +<tr class="codeline" data-linenumber="319"><td class="num" id="LN319">319</td><td class="line"> <span class='comment'>* - next sunrise, when icon changes to daytime version</span></td></tr> +<tr class="codeline" data-linenumber="320"><td class="num" id="LN320">320</td><td class="line"> <span class='comment'>* - next sunset, when icon changes to nighttime version</span></td></tr> +<tr class="codeline" data-linenumber="321"><td class="num" id="LN321">321</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="322"><td class="num" id="LN322">322</td><td class="line">gint</td></tr> +<tr class="codeline" data-linenumber="323"><td class="num" id="LN323">323</td><td class="line">weather_info_next_sun_event (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="324"><td class="num" id="LN324">324</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="325"><td class="num" id="LN325">325</td><td class="line"> time_t now = time (<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="326"><td class="num" id="LN326">326</td><td class="line"> <span class='keyword'>struct</span> tm ltm;</td></tr> +<tr class="codeline" data-linenumber="327"><td class="num" id="LN327">327</td><td class="line"> time_t nxtEvent;</td></tr> +<tr class="codeline" data-linenumber="328"><td class="num" id="LN328">328</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="329"><td class="num" id="LN329">329</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, -1)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_11<br>; if (info != ((void*)0)) _g_boolean_var_11 = 1; else _g_boolean_var_11<br> = 0; _g_boolean_var_11; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (-1); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="330"><td class="num" id="LN330">330</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="331"><td class="num" id="LN331">331</td><td class="line"> <span class='keyword'>if</span> (!calc_sun (info))</td></tr> +<tr class="codeline" data-linenumber="332"><td class="num" id="LN332">332</td><td class="line"> <span class='keyword'>return</span> -1;</td></tr> +<tr class="codeline" data-linenumber="333"><td class="num" id="LN333">333</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="334"><td class="num" id="LN334">334</td><td class="line"> <span class='comment'>/* Determine when the next local midnight occurs */</span></td></tr> +<tr class="codeline" data-linenumber="335"><td class="num" id="LN335">335</td><td class="line"> (<span class='keyword'>void</span>) localtime_r (&now, &ltm);</td></tr> +<tr class="codeline" data-linenumber="336"><td class="num" id="LN336">336</td><td class="line"> ltm.tm_sec = 0;</td></tr> +<tr class="codeline" data-linenumber="337"><td class="num" id="LN337">337</td><td class="line"> ltm.tm_min = 0;</td></tr> +<tr class="codeline" data-linenumber="338"><td class="num" id="LN338">338</td><td class="line"> ltm.tm_hour = 0;</td></tr> +<tr class="codeline" data-linenumber="339"><td class="num" id="LN339">339</td><td class="line"> ltm.tm_mday++;</td></tr> +<tr class="codeline" data-linenumber="340"><td class="num" id="LN340">340</td><td class="line"> nxtEvent = mktime (&ltm);</td></tr> +<tr class="codeline" data-linenumber="341"><td class="num" id="LN341">341</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="342"><td class="num" id="LN342">342</td><td class="line"> <span class='keyword'>if</span> (info->sunsetValid &&</td></tr> +<tr class="codeline" data-linenumber="343"><td class="num" id="LN343">343</td><td class="line"> (info->sunset > now) && (info->sunset < nxtEvent))</td></tr> +<tr class="codeline" data-linenumber="344"><td class="num" id="LN344">344</td><td class="line"> nxtEvent = info->sunset;</td></tr> +<tr class="codeline" data-linenumber="345"><td class="num" id="LN345">345</td><td class="line"> <span class='keyword'>if</span> (info->sunriseValid &&</td></tr> +<tr class="codeline" data-linenumber="346"><td class="num" id="LN346">346</td><td class="line"> (info->sunrise > now) && (info->sunrise < nxtEvent))</td></tr> +<tr class="codeline" data-linenumber="347"><td class="num" id="LN347">347</td><td class="line"> nxtEvent = info->sunrise;</td></tr> +<tr class="codeline" data-linenumber="348"><td class="num" id="LN348">348</td><td class="line"> <span class='keyword'>return</span> (gint)(nxtEvent - now);</td></tr> +<tr class="codeline" data-linenumber="349"><td class="num" id="LN349">349</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-3d7553.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-3d7553.html new file mode 100644 index 0000000..9047d97 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-3d7553.html @@ -0,0 +1,775 @@ +<!doctype html> +<html> +<head> +<title>test_metar.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Opened file is never closed; potential resource leak --> + +<!-- BUGTYPE Resource Leak --> + +<!-- BUGCATEGORY Unix Stream API Error --> + +<!-- BUGFILE /rootdir/libmateweather/test_metar.c --> + +<!-- FILENAME test_metar.c --> + +<!-- FUNCTIONNAME main --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 3d7553bc3a6b66b21a2fbf7209eca6d1 --> + +<!-- BUGLINE 73 --> + +<!-- BUGCOLUMN 12 --> + +<!-- BUGPATHLENGTH 8 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>test_metar.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 73, column 12</a><br />Opened file is never closed; potential resource leak</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name test_metar.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model static -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c test_metar.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"16": 1, "17": 1, "18": 1, "19": 1, "20": 1, "21": 1, "22": 1, "26": 1, "27": 1, "28": 1, "29": 1, "30": 1, "32": 1, "33": 1, "34": 1, "36": 1, "40": 1, "41": 1, "42": 1, "50": 1, "73": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + <path class="arrow" id="arrow0"/> + <path class="arrow" id="arrow1"/> + <path class="arrow" id="arrow2"/> + <path class="arrow" id="arrow3"/> + <path class="arrow" id="arrow4"/> + <path class="arrow" id="arrow5"/> + <path class="arrow" id="arrow6"/> + <path class="arrow" id="arrow7"/> + <path class="arrow" id="arrow8"/> + <path class="arrow" id="arrow9"/> + <path class="arrow" id="arrow10"/> + <path class="arrow" id="arrow11"/> + <path class="arrow" id="arrow12"/> + <path class="arrow" id="arrow13"/> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 14,12,10,10,8,5,3,0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>* Simple program to reproduce METAR parsing results from command line</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"><span class='directive'>#include <glib.h></span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"><span class='directive'>#include <string.h></span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"><span class='directive'>#include <stdio.h></span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"><span class='directive'>#ifndef <span class='macro'>BUFLEN<span class='macro_popup'>4096</span></span></span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"><span class='directive'>#define <span class='macro'>BUFLEN<span class='macro_popup'>4096</span></span> 4096</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"><span class='directive'>#endif /* BUFLEN */</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"><span class='keyword'>int</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line">main (<span class='keyword'>int</span> argc, <span class='keyword'>char</span> **argv)</td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"> <span id="start13">FILE</span>* stream = <span class='macro'>stdin<span class='macro_popup'>stdin</span></span>;</td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"> gchar* filename = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"> GOptionEntry entries[] = {</td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> { <span class='string_literal'>"file"</span>, 'f', 0, G_OPTION_ARG_FILENAME, &filename,</td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"> <span class='string_literal'>"file constaining metar observations"</span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span> },</td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"> { <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, 0, 0, G_OPTION_ARG_NONE, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span> }</td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"> };</td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"> GOptionContext* context;</td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"> GError* error = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"> <span class='keyword'>char</span> buf[<span class='macro'>BUFLEN<span class='macro_popup'>4096</span></span>];</td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"> <span class='keyword'>int</span> len;</td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"> WeatherInfo info;</td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"> context = g_option_context_new (<span class='string_literal'>"- test libmateweather metar parser"</span>);</td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"> g_option_context_add_main_entries (context, entries, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> g_option_context_parse (context, &argc, &argv, &error);</td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"> <span id="start12"><span id="end13"><span class='keyword'>if</span></span></span> (<span id="start11"><span class="mrange"><span id="end12">error</span></span></span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path1" class="msg msgEvent" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">1</div></td><td>Assuming 'error' is null</td><td><div class="PathNav"><a href="#Path2" title="Next event (2)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path2" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">2</div></td><td><div class="PathNav"><a href="#Path1" title="Previous event (1)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path3" title="Next event (3)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> perror (error->message);</td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"> <span class='keyword'>return</span> error->code;</td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"> <span id="start10"><span id="end11"><span class='keyword'>if</span></span></span> (<span id="start9"><span class="mrange"><span id="end10">filename</span></span></span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path3" class="msg msgEvent" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">3</div></td><td><div class="PathNav"><a href="#Path2" title="Previous event (2)">←</a></div></td><td>Assuming 'filename' is non-null</td><td><div class="PathNav"><a href="#Path4" title="Next event (4)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path4" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">4</div></td><td><div class="PathNav"><a href="#Path3" title="Previous event (3)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path5" title="Next event (5)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> <span id="start6"><span id="end7"><span id="start8"><span id="end9">stream</span></span></span></span> = fopen (<span id="start7"><span id="end8">filename</span></span>, <span class='string_literal'>"r"</span>);</td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line"> <span id="start5"><span id="end6"><span class='keyword'>if</span></span></span> (<span id="start4"><span class="mrange"><span id="end5">!</span></span>stream</span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path5" class="msg msgEvent" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">5</div></td><td><div class="PathNav"><a href="#Path4" title="Previous event (4)">←</a></div></td><td>Assuming 'stream' is non-null</td><td><div class="PathNav"><a href="#Path6" title="Next event (6)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path6" class="msg msgControl" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">6</div></td><td><div class="PathNav"><a href="#Path5" title="Previous event (5)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path7" title="Next event (7)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> perror (<span class='string_literal'>"fopen"</span>);</td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"> <span class='keyword'>return</span> -1;</td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line"> fprintf (<span class='macro'>stderr<span class='macro_popup'>stderr</span></span>, <span class='string_literal'>"Enter a METAR string...\n"</span>);</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> <span id="start3"><span id="end4"><span class='keyword'>while</span></span></span> (<span id="start1"><span id="end2">fgets</span></span> (<span id="start2"><span id="end3">buf</span></span>, <span class='keyword'>sizeof</span> (buf), stream)) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path7" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">7</div></td><td><div class="PathNav"><a href="#Path6" title="Previous event (6)">←</a></div></td><td>Loop condition is false. Execution continues on line 73</td><td><div class="PathNav"><a href="#EndPath" title="Next event (8)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> len = strlen (buf);</td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> <span class='keyword'>if</span> (buf[len - 1] == '\n') {</td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> buf[--len] = '\0';</td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> printf (<span class='string_literal'>"\n%s\n"</span>, buf);</td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> memset (&info, 0, <span class='keyword'>sizeof</span> (info));</td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> info.valid = 1;</td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> metar_parse (buf, &info);</td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> weather_info_to_metric (&info);</td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> printf (<span class='string_literal'>"Returned info:\n"</span>);</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> printf (<span class='string_literal'>" update: %s"</span>, ctime (&info.update));</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> printf (<span class='string_literal'>" sky: %s\n"</span>, weather_info_get_sky (&info));</td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> printf (<span class='string_literal'>" cond: %s\n"</span>, weather_info_get_conditions (&info));</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> printf (<span class='string_literal'>" temp: %s\n"</span>, weather_info_get_temp (&info));</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> printf (<span class='string_literal'>" dewp: %s\n"</span>, weather_info_get_dew (&info));</td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> printf (<span class='string_literal'>" wind: %s\n"</span>, weather_info_get_wind (&info));</td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"> printf (<span class='string_literal'>" pressure: %s\n"</span>, weather_info_get_pressure (&info));</td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> printf (<span class='string_literal'>" vis: %s\n"</span>, weather_info_get_visibility (&info));</td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='comment'>// TODO: retrieve location's lat/lon to display sunrise/set times</span></td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line"> <span id="start0"><span id="end1"><span class='keyword'>return</span></span></span> <span class="mrange"><span id="end0">0</span></span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:12ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">8</div></td><td><div class="PathNav"><a href="#Path7" title="Previous event (7)">←</a></div></td><td>Opened file is never closed; potential resource leak</td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-54e1e1.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-54e1e1.html new file mode 100644 index 0000000..e3e6a07 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-54e1e1.html @@ -0,0 +1,1245 @@ +<!doctype html> +<html> +<head> +<title>weather-metar.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC This statement is never executed --> + +<!-- BUGTYPE Unreachable code --> + +<!-- BUGCATEGORY Unused code --> + +<!-- BUGFILE /rootdir/libmateweather/weather-metar.c --> + +<!-- FILENAME weather-metar.c --> + +<!-- FUNCTIONNAME metar_tok_vis --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 54e1e1a0afeccd04162c41a01d40e8bb --> + +<!-- BUGLINE 177 --> + +<!-- BUGCOLUMN 28 --> + +<!-- BUGPATHLENGTH 1 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather-metar.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 177, column 28</a><br />This statement is never executed</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather-metar.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather-metar.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"177": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather-metar.c - Weather server functions (METAR)</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"><span class='directive'>#include <stdlib.h></span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"><span class='directive'>#include <string.h></span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"><span class='directive'>#include <sys/types.h></span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"><span class='directive'>#include <regex.h></span></td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#include "weather.h"</span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"><span class='keyword'>enum</span> {</td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"> TIME_RE,</td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> WIND_RE,</td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"> VIS_RE,</td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"> COND_RE,</td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> CLOUD_RE,</td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"> TEMP_RE,</td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> PRES_RE,</td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> RE_NUM</td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"><span class='comment'>/* Return time of weather report as secs since epoch UTC */</span></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line"><span class='keyword'>static</span> time_t</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line">make_time (gint utcDate, gint utcHour, gint utcMin)</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> <span class='keyword'>const</span> time_t now = time (<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> localtime_r (&now, &tm);</td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> <span class='comment'>/* If last reading took place just before midnight UTC on the</span></td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> <span class='comment'>* first, adjust the date downward to allow for the month</span></td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> <span class='comment'>* change-over. This ASSUMES that the reading won't be more than</span></td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> <span class='comment'>* 24 hrs old! */</span></td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> <span class='keyword'>if</span> ((utcDate > tm.tm_mday) && (tm.tm_mday == 1)) {</td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> tm.tm_mday = 0; <span class='comment'>/* mktime knows this is the last day of the previous</span></td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> <span class='comment'>* month. */</span></td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> tm.tm_mday = utcDate;</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> tm.tm_hour = utcHour;</td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> tm.tm_min = utcMin;</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> tm.tm_sec = 0;</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> <span class='comment'>/* mktime() assumes value is local, not UTC. Use tm_gmtoff to compensate */</span></td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_TM_TM_GMOFF<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> <span class='keyword'>return</span> tm.tm_gmtoff + mktime (&tm);</td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"><span class='directive'>#elif defined HAVE_TIMEZONE</span></td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='keyword'>return</span> timezone + mktime (&tm);</td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line">metar_tok_time (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> gint day, hr, min;</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line"> sscanf (tokp, <span class='string_literal'>"%2u%2u%2u"</span>, &day, &hr, &min);</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> info->update = make_time (day, hr, min);</td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line">metar_tok_wind (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"> gchar sdir[4], sspd[4], sgust[4];</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line"> gint dir, spd = -1;</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line"> gchar *gustp;</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> size_t glen;</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> strncpy (sdir, tokp, 3);</td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"> sdir[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> dir = (!strcmp (sdir, <span class='string_literal'>"VRB"</span>)) ? -1 : atoi (sdir);</td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> memset (sspd, 0, <span class='keyword'>sizeof</span> (sspd));</td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> glen = strspn (tokp + 3, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>);</td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"> strncpy (sspd, tokp + 3, glen);</td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line"> spd = atoi (sspd);</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> tokp += glen + 3;</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line"> gustp = strchr (tokp, 'G');</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> <span class='keyword'>if</span> (gustp) {</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> memset (sgust, 0, <span class='keyword'>sizeof</span> (sgust));</td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> glen = strspn (gustp + 1, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>);</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> strncpy (sgust, gustp + 1, glen);</td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> tokp = gustp + 1 + glen;</td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> <span class='keyword'>if</span> (!strcmp (tokp, <span class='string_literal'>"MPS"</span>))</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> info->windspeed = <span class='macro'>WINDSPEED_MS_TO_KNOTS ((WeatherWindSpeed)spd)<span class='macro_popup'>(((WeatherWindSpeed)spd) / 0.514444)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line"> info->windspeed = (WeatherWindSpeed)spd;</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"> <span class='keyword'>if</span> ((349 <= dir) || (dir <= 11))</td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line"> info->wind = WIND_N;</td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((12 <= dir) && (dir <= 33))</td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line"> info->wind = WIND_NNE;</td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((34 <= dir) && (dir <= 56))</td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line"> info->wind = WIND_NE;</td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((57 <= dir) && (dir <= 78))</td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line"> info->wind = WIND_ENE;</td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((79 <= dir) && (dir <= 101))</td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line"> info->wind = WIND_E;</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((102 <= dir) && (dir <= 123))</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line"> info->wind = WIND_ESE;</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((124 <= dir) && (dir <= 146))</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> info->wind = WIND_SE;</td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((147 <= dir) && (dir <= 168))</td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> info->wind = WIND_SSE;</td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((169 <= dir) && (dir <= 191))</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> info->wind = WIND_S;</td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((192 <= dir) && (dir <= 213))</td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> info->wind = WIND_SSW;</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((214 <= dir) && (dir <= 236))</td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> info->wind = WIND_SW;</td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((237 <= dir) && (dir <= 258))</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> info->wind = WIND_WSW;</td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((259 <= dir) && (dir <= 281))</td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> info->wind = WIND_W;</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((282 <= dir) && (dir <= 303))</td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> info->wind = WIND_WNW;</td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((304 <= dir) && (dir <= 326))</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> info->wind = WIND_NW;</td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((327 <= dir) && (dir <= 348))</td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line"> info->wind = WIND_NNW;</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line">metar_tok_vis (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> gchar *pfrac, *pend, *psp;</td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> gchar sval[6];</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> gint num, den, val;</td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> memset (sval, 0, <span class='keyword'>sizeof</span> (sval));</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> <span class='keyword'>if</span> (!strcmp (tokp,<span class='string_literal'>"CAVOK"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"> <span class='comment'>// "Ceiling And Visibility OK": visibility >= 10 KM</span></td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line"> info->visibility=10000. / <span class='macro'>VISIBILITY_SM_TO_M (1.)<span class='macro_popup'>(((1.) * 1.609344) * 1000)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (0 != (pend = strstr (tokp, <span class='string_literal'>"SM"</span>))) {</td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"> <span class='comment'>// US observation: field ends with "SM"</span></td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line"> pfrac = strchr (tokp, '/');</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line"> <span class='keyword'>if</span> (pfrac) {</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> <span class='keyword'>if</span> (*tokp == 'M') {</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> info->visibility = 0.001;</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> num = (*(pfrac - 1) - '0');</td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> strncpy (sval, pfrac + 1, pend - pfrac - 1);</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> den = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> info->visibility =</td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> ((WeatherVisibility)num / ((WeatherVisibility)den));</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> psp = strchr (tokp, ' ');</td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> <span class='keyword'>if</span> (psp) {</td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> *psp = <span class="mrange">'\0';</td></tr></span> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:28ex">This statement is never executed</div></td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line"> val = atoi (tokp);</td></tr> +<tr class="codeline" data-linenumber="179"><td class="num" id="LN179">179</td><td class="line"> info->visibility += (WeatherVisibility)val;</td></tr> +<tr class="codeline" data-linenumber="180"><td class="num" id="LN180">180</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="181"><td class="num" id="LN181">181</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="182"><td class="num" id="LN182">182</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="183"><td class="num" id="LN183">183</td><td class="line"> strncpy (sval, tokp, pend - tokp);</td></tr> +<tr class="codeline" data-linenumber="184"><td class="num" id="LN184">184</td><td class="line"> val = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="185"><td class="num" id="LN185">185</td><td class="line"> info->visibility = (WeatherVisibility)val;</td></tr> +<tr class="codeline" data-linenumber="186"><td class="num" id="LN186">186</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="187"><td class="num" id="LN187">187</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="188"><td class="num" id="LN188">188</td><td class="line"> <span class='comment'>// International observation: NNNN(DD NNNNDD)?</span></td></tr> +<tr class="codeline" data-linenumber="189"><td class="num" id="LN189">189</td><td class="line"> <span class='comment'>// For now: use only the minimum visibility and ignore its direction</span></td></tr> +<tr class="codeline" data-linenumber="190"><td class="num" id="LN190">190</td><td class="line"> strncpy (sval, tokp, strspn (tokp, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>));</td></tr> +<tr class="codeline" data-linenumber="191"><td class="num" id="LN191">191</td><td class="line"> val = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="192"><td class="num" id="LN192">192</td><td class="line"> info->visibility = (WeatherVisibility)val / <span class='macro'>VISIBILITY_SM_TO_M (1.)<span class='macro_popup'>(((1.) * 1.609344) * 1000)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="193"><td class="num" id="LN193">193</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="194"><td class="num" id="LN194">194</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="195"><td class="num" id="LN195">195</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="196"><td class="num" id="LN196">196</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="197"><td class="num" id="LN197">197</td><td class="line">metar_tok_cloud (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="198"><td class="num" id="LN198">198</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="199"><td class="num" id="LN199">199</td><td class="line"> gchar stype[4], salt[4];</td></tr> +<tr class="codeline" data-linenumber="200"><td class="num" id="LN200">200</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="201"><td class="num" id="LN201">201</td><td class="line"> strncpy (stype, tokp, 3);</td></tr> +<tr class="codeline" data-linenumber="202"><td class="num" id="LN202">202</td><td class="line"> stype[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="203"><td class="num" id="LN203">203</td><td class="line"> <span class='keyword'>if</span> (strlen (tokp) == 6) {</td></tr> +<tr class="codeline" data-linenumber="204"><td class="num" id="LN204">204</td><td class="line"> strncpy (salt, tokp + 3, 3);</td></tr> +<tr class="codeline" data-linenumber="205"><td class="num" id="LN205">205</td><td class="line"> salt[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="206"><td class="num" id="LN206">206</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="207"><td class="num" id="LN207">207</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="208"><td class="num" id="LN208">208</td><td class="line"> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"CLR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="209"><td class="num" id="LN209">209</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="210"><td class="num" id="LN210">210</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"SKC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="211"><td class="num" id="LN211">211</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="212"><td class="num" id="LN212">212</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"NSC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="213"><td class="num" id="LN213">213</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="214"><td class="num" id="LN214">214</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"BKN"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="215"><td class="num" id="LN215">215</td><td class="line"> info->sky = SKY_BROKEN;</td></tr> +<tr class="codeline" data-linenumber="216"><td class="num" id="LN216">216</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"SCT"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="217"><td class="num" id="LN217">217</td><td class="line"> info->sky = SKY_SCATTERED;</td></tr> +<tr class="codeline" data-linenumber="218"><td class="num" id="LN218">218</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"FEW"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="219"><td class="num" id="LN219">219</td><td class="line"> info->sky = SKY_FEW;</td></tr> +<tr class="codeline" data-linenumber="220"><td class="num" id="LN220">220</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"OVC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="221"><td class="num" id="LN221">221</td><td class="line"> info->sky = SKY_OVERCAST;</td></tr> +<tr class="codeline" data-linenumber="222"><td class="num" id="LN222">222</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="223"><td class="num" id="LN223">223</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="224"><td class="num" id="LN224">224</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="225"><td class="num" id="LN225">225</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="226"><td class="num" id="LN226">226</td><td class="line">metar_tok_pres (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="227"><td class="num" id="LN227">227</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="228"><td class="num" id="LN228">228</td><td class="line"> <span class='keyword'>if</span> (*tokp == 'A') {</td></tr> +<tr class="codeline" data-linenumber="229"><td class="num" id="LN229">229</td><td class="line"> gchar sintg[3], sfract[3];</td></tr> +<tr class="codeline" data-linenumber="230"><td class="num" id="LN230">230</td><td class="line"> gint intg, fract;</td></tr> +<tr class="codeline" data-linenumber="231"><td class="num" id="LN231">231</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="232"><td class="num" id="LN232">232</td><td class="line"> strncpy (sintg, tokp + 1, 2);</td></tr> +<tr class="codeline" data-linenumber="233"><td class="num" id="LN233">233</td><td class="line"> sintg[2] = 0;</td></tr> +<tr class="codeline" data-linenumber="234"><td class="num" id="LN234">234</td><td class="line"> intg = atoi (sintg);</td></tr> +<tr class="codeline" data-linenumber="235"><td class="num" id="LN235">235</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="236"><td class="num" id="LN236">236</td><td class="line"> strncpy (sfract, tokp + 3, 2);</td></tr> +<tr class="codeline" data-linenumber="237"><td class="num" id="LN237">237</td><td class="line"> sfract[2] = 0;</td></tr> +<tr class="codeline" data-linenumber="238"><td class="num" id="LN238">238</td><td class="line"> fract = atoi (sfract);</td></tr> +<tr class="codeline" data-linenumber="239"><td class="num" id="LN239">239</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="240"><td class="num" id="LN240">240</td><td class="line"> info->pressure = (WeatherPressure)intg + (((WeatherPressure)fract)/100.0);</td></tr> +<tr class="codeline" data-linenumber="241"><td class="num" id="LN241">241</td><td class="line"> } <span class='keyword'>else</span> { <span class='comment'>/* *tokp == 'Q' */</span></td></tr> +<tr class="codeline" data-linenumber="242"><td class="num" id="LN242">242</td><td class="line"> gchar spres[5];</td></tr> +<tr class="codeline" data-linenumber="243"><td class="num" id="LN243">243</td><td class="line"> gint pres;</td></tr> +<tr class="codeline" data-linenumber="244"><td class="num" id="LN244">244</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="245"><td class="num" id="LN245">245</td><td class="line"> strncpy (spres, tokp + 1, 4);</td></tr> +<tr class="codeline" data-linenumber="246"><td class="num" id="LN246">246</td><td class="line"> spres[4] = 0;</td></tr> +<tr class="codeline" data-linenumber="247"><td class="num" id="LN247">247</td><td class="line"> pres = atoi (spres);</td></tr> +<tr class="codeline" data-linenumber="248"><td class="num" id="LN248">248</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="249"><td class="num" id="LN249">249</td><td class="line"> info->pressure = <span class='macro'>PRESSURE_MBAR_TO_INCH ((WeatherPressure)pres)<span class='macro_popup'>(((WeatherPressure)pres) * 0.029533373)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="250"><td class="num" id="LN250">250</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="251"><td class="num" id="LN251">251</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="252"><td class="num" id="LN252">252</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="253"><td class="num" id="LN253">253</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="254"><td class="num" id="LN254">254</td><td class="line">metar_tok_temp (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="255"><td class="num" id="LN255">255</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="256"><td class="num" id="LN256">256</td><td class="line"> gchar *ptemp, *pdew, *psep;</td></tr> +<tr class="codeline" data-linenumber="257"><td class="num" id="LN257">257</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="258"><td class="num" id="LN258">258</td><td class="line"> psep = strchr (tokp, '/');</td></tr> +<tr class="codeline" data-linenumber="259"><td class="num" id="LN259">259</td><td class="line"> *psep = 0;</td></tr> +<tr class="codeline" data-linenumber="260"><td class="num" id="LN260">260</td><td class="line"> ptemp = tokp;</td></tr> +<tr class="codeline" data-linenumber="261"><td class="num" id="LN261">261</td><td class="line"> pdew = psep + 1;</td></tr> +<tr class="codeline" data-linenumber="262"><td class="num" id="LN262">262</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="263"><td class="num" id="LN263">263</td><td class="line"> info->temp = (*ptemp == 'M') ? <span class='macro'>TEMP_C_TO_F (-atoi (ptemp + 1))<span class='macro_popup'>(((-atoi (ptemp + 1)) * (9.0/5.0)) + 32.0)</span></span></td></tr> +<tr class="codeline" data-linenumber="264"><td class="num" id="LN264">264</td><td class="line"> : <span class='macro'>TEMP_C_TO_F (atoi (ptemp))<span class='macro_popup'>(((atoi (ptemp)) * (9.0/5.0)) + 32.0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="265"><td class="num" id="LN265">265</td><td class="line"> <span class='keyword'>if</span> (*pdew) {</td></tr> +<tr class="codeline" data-linenumber="266"><td class="num" id="LN266">266</td><td class="line"> info->dew = (*pdew == 'M') ? <span class='macro'>TEMP_C_TO_F (-atoi (pdew + 1))<span class='macro_popup'>(((-atoi (pdew + 1)) * (9.0/5.0)) + 32.0)</span></span></td></tr> +<tr class="codeline" data-linenumber="267"><td class="num" id="LN267">267</td><td class="line"> : <span class='macro'>TEMP_C_TO_F (atoi (pdew))<span class='macro_popup'>(((atoi (pdew)) * (9.0/5.0)) + 32.0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="268"><td class="num" id="LN268">268</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="269"><td class="num" id="LN269">269</td><td class="line"> info->dew = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="270"><td class="num" id="LN270">270</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="271"><td class="num" id="LN271">271</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="272"><td class="num" id="LN272">272</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="273"><td class="num" id="LN273">273</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="274"><td class="num" id="LN274">274</td><td class="line">metar_tok_cond (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="275"><td class="num" id="LN275">275</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="276"><td class="num" id="LN276">276</td><td class="line"> gchar squal[3], sphen[4];</td></tr> +<tr class="codeline" data-linenumber="277"><td class="num" id="LN277">277</td><td class="line"> gchar *pphen;</td></tr> +<tr class="codeline" data-linenumber="278"><td class="num" id="LN278">278</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="279"><td class="num" id="LN279">279</td><td class="line"> <span class='keyword'>if</span> ((strlen (tokp) > 3) && ((*tokp == '+') || (*tokp == '-')))</td></tr> +<tr class="codeline" data-linenumber="280"><td class="num" id="LN280">280</td><td class="line"> ++tokp; <span class='comment'>/* FIX */</span></td></tr> +<tr class="codeline" data-linenumber="281"><td class="num" id="LN281">281</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="282"><td class="num" id="LN282">282</td><td class="line"> <span class='keyword'>if</span> ((*tokp == '+') || (*tokp == '-'))</td></tr> +<tr class="codeline" data-linenumber="283"><td class="num" id="LN283">283</td><td class="line"> pphen = tokp + 1;</td></tr> +<tr class="codeline" data-linenumber="284"><td class="num" id="LN284">284</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (strlen (tokp) < 4)</td></tr> +<tr class="codeline" data-linenumber="285"><td class="num" id="LN285">285</td><td class="line"> pphen = tokp;</td></tr> +<tr class="codeline" data-linenumber="286"><td class="num" id="LN286">286</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="287"><td class="num" id="LN287">287</td><td class="line"> pphen = tokp + 2;</td></tr> +<tr class="codeline" data-linenumber="288"><td class="num" id="LN288">288</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="289"><td class="num" id="LN289">289</td><td class="line"> memset (squal, 0, <span class='keyword'>sizeof</span> (squal));</td></tr> +<tr class="codeline" data-linenumber="290"><td class="num" id="LN290">290</td><td class="line"> strncpy (squal, tokp, pphen - tokp);</td></tr> +<tr class="codeline" data-linenumber="291"><td class="num" id="LN291">291</td><td class="line"> squal[pphen - tokp] = 0;</td></tr> +<tr class="codeline" data-linenumber="292"><td class="num" id="LN292">292</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="293"><td class="num" id="LN293">293</td><td class="line"> memset (sphen, 0, <span class='keyword'>sizeof</span> (sphen));</td></tr> +<tr class="codeline" data-linenumber="294"><td class="num" id="LN294">294</td><td class="line"> strncpy (sphen, pphen, <span class='keyword'>sizeof</span> (sphen));</td></tr> +<tr class="codeline" data-linenumber="295"><td class="num" id="LN295">295</td><td class="line"> sphen[<span class='keyword'>sizeof</span> (sphen)-1] = '\0';</td></tr> +<tr class="codeline" data-linenumber="296"><td class="num" id="LN296">296</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="297"><td class="num" id="LN297">297</td><td class="line"> <span class='comment'>/* Defaults */</span></td></tr> +<tr class="codeline" data-linenumber="298"><td class="num" id="LN298">298</td><td class="line"> info->cond.qualifier = QUALIFIER_NONE;</td></tr> +<tr class="codeline" data-linenumber="299"><td class="num" id="LN299">299</td><td class="line"> info->cond.phenomenon = PHENOMENON_NONE;</td></tr> +<tr class="codeline" data-linenumber="300"><td class="num" id="LN300">300</td><td class="line"> info->cond.significant = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="301"><td class="num" id="LN301">301</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="302"><td class="num" id="LN302">302</td><td class="line"> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>""</span>)) {</td></tr> +<tr class="codeline" data-linenumber="303"><td class="num" id="LN303">303</td><td class="line"> info->cond.qualifier = QUALIFIER_MODERATE;</td></tr> +<tr class="codeline" data-linenumber="304"><td class="num" id="LN304">304</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"-"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="305"><td class="num" id="LN305">305</td><td class="line"> info->cond.qualifier = QUALIFIER_LIGHT;</td></tr> +<tr class="codeline" data-linenumber="306"><td class="num" id="LN306">306</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"+"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="307"><td class="num" id="LN307">307</td><td class="line"> info->cond.qualifier = QUALIFIER_HEAVY;</td></tr> +<tr class="codeline" data-linenumber="308"><td class="num" id="LN308">308</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"VC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="309"><td class="num" id="LN309">309</td><td class="line"> info->cond.qualifier = QUALIFIER_VICINITY;</td></tr> +<tr class="codeline" data-linenumber="310"><td class="num" id="LN310">310</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"MI"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="311"><td class="num" id="LN311">311</td><td class="line"> info->cond.qualifier = QUALIFIER_SHALLOW;</td></tr> +<tr class="codeline" data-linenumber="312"><td class="num" id="LN312">312</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"BC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="313"><td class="num" id="LN313">313</td><td class="line"> info->cond.qualifier = QUALIFIER_PATCHES;</td></tr> +<tr class="codeline" data-linenumber="314"><td class="num" id="LN314">314</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"PR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="315"><td class="num" id="LN315">315</td><td class="line"> info->cond.qualifier = QUALIFIER_PARTIAL;</td></tr> +<tr class="codeline" data-linenumber="316"><td class="num" id="LN316">316</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"TS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="317"><td class="num" id="LN317">317</td><td class="line"> info->cond.qualifier = QUALIFIER_THUNDERSTORM;</td></tr> +<tr class="codeline" data-linenumber="318"><td class="num" id="LN318">318</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"BL"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="319"><td class="num" id="LN319">319</td><td class="line"> info->cond.qualifier = QUALIFIER_BLOWING;</td></tr> +<tr class="codeline" data-linenumber="320"><td class="num" id="LN320">320</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"SH"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="321"><td class="num" id="LN321">321</td><td class="line"> info->cond.qualifier = QUALIFIER_SHOWERS;</td></tr> +<tr class="codeline" data-linenumber="322"><td class="num" id="LN322">322</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"DR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="323"><td class="num" id="LN323">323</td><td class="line"> info->cond.qualifier = QUALIFIER_DRIFTING;</td></tr> +<tr class="codeline" data-linenumber="324"><td class="num" id="LN324">324</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"FZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="325"><td class="num" id="LN325">325</td><td class="line"> info->cond.qualifier = QUALIFIER_FREEZING;</td></tr> +<tr class="codeline" data-linenumber="326"><td class="num" id="LN326">326</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="327"><td class="num" id="LN327">327</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="328"><td class="num" id="LN328">328</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="329"><td class="num" id="LN329">329</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="330"><td class="num" id="LN330">330</td><td class="line"> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="331"><td class="num" id="LN331">331</td><td class="line"> info->cond.phenomenon = PHENOMENON_DRIZZLE;</td></tr> +<tr class="codeline" data-linenumber="332"><td class="num" id="LN332">332</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"RA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="333"><td class="num" id="LN333">333</td><td class="line"> info->cond.phenomenon = PHENOMENON_RAIN;</td></tr> +<tr class="codeline" data-linenumber="334"><td class="num" id="LN334">334</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SN"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="335"><td class="num" id="LN335">335</td><td class="line"> info->cond.phenomenon = PHENOMENON_SNOW;</td></tr> +<tr class="codeline" data-linenumber="336"><td class="num" id="LN336">336</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SG"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="337"><td class="num" id="LN337">337</td><td class="line"> info->cond.phenomenon = PHENOMENON_SNOW_GRAINS;</td></tr> +<tr class="codeline" data-linenumber="338"><td class="num" id="LN338">338</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"IC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="339"><td class="num" id="LN339">339</td><td class="line"> info->cond.phenomenon = PHENOMENON_ICE_CRYSTALS;</td></tr> +<tr class="codeline" data-linenumber="340"><td class="num" id="LN340">340</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PE"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="341"><td class="num" id="LN341">341</td><td class="line"> info->cond.phenomenon = PHENOMENON_ICE_PELLETS;</td></tr> +<tr class="codeline" data-linenumber="342"><td class="num" id="LN342">342</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"GR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="343"><td class="num" id="LN343">343</td><td class="line"> info->cond.phenomenon = PHENOMENON_HAIL;</td></tr> +<tr class="codeline" data-linenumber="344"><td class="num" id="LN344">344</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"GS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="345"><td class="num" id="LN345">345</td><td class="line"> info->cond.phenomenon = PHENOMENON_SMALL_HAIL;</td></tr> +<tr class="codeline" data-linenumber="346"><td class="num" id="LN346">346</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"UP"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="347"><td class="num" id="LN347">347</td><td class="line"> info->cond.phenomenon = PHENOMENON_UNKNOWN_PRECIPITATION;</td></tr> +<tr class="codeline" data-linenumber="348"><td class="num" id="LN348">348</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"BR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="349"><td class="num" id="LN349">349</td><td class="line"> info->cond.phenomenon = PHENOMENON_MIST;</td></tr> +<tr class="codeline" data-linenumber="350"><td class="num" id="LN350">350</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FG"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="351"><td class="num" id="LN351">351</td><td class="line"> info->cond.phenomenon = PHENOMENON_FOG;</td></tr> +<tr class="codeline" data-linenumber="352"><td class="num" id="LN352">352</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FU"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="353"><td class="num" id="LN353">353</td><td class="line"> info->cond.phenomenon = PHENOMENON_SMOKE;</td></tr> +<tr class="codeline" data-linenumber="354"><td class="num" id="LN354">354</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"VA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="355"><td class="num" id="LN355">355</td><td class="line"> info->cond.phenomenon = PHENOMENON_VOLCANIC_ASH;</td></tr> +<tr class="codeline" data-linenumber="356"><td class="num" id="LN356">356</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="357"><td class="num" id="LN357">357</td><td class="line"> info->cond.phenomenon = PHENOMENON_SAND;</td></tr> +<tr class="codeline" data-linenumber="358"><td class="num" id="LN358">358</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"HZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="359"><td class="num" id="LN359">359</td><td class="line"> info->cond.phenomenon = PHENOMENON_HAZE;</td></tr> +<tr class="codeline" data-linenumber="360"><td class="num" id="LN360">360</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PY"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="361"><td class="num" id="LN361">361</td><td class="line"> info->cond.phenomenon = PHENOMENON_SPRAY;</td></tr> +<tr class="codeline" data-linenumber="362"><td class="num" id="LN362">362</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DU"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="363"><td class="num" id="LN363">363</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUST;</td></tr> +<tr class="codeline" data-linenumber="364"><td class="num" id="LN364">364</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SQ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="365"><td class="num" id="LN365">365</td><td class="line"> info->cond.phenomenon = PHENOMENON_SQUALL;</td></tr> +<tr class="codeline" data-linenumber="366"><td class="num" id="LN366">366</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="367"><td class="num" id="LN367">367</td><td class="line"> info->cond.phenomenon = PHENOMENON_SANDSTORM;</td></tr> +<tr class="codeline" data-linenumber="368"><td class="num" id="LN368">368</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="369"><td class="num" id="LN369">369</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUSTSTORM;</td></tr> +<tr class="codeline" data-linenumber="370"><td class="num" id="LN370">370</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PO"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="371"><td class="num" id="LN371">371</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUST_WHIRLS;</td></tr> +<tr class="codeline" data-linenumber="372"><td class="num" id="LN372">372</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"+FC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="373"><td class="num" id="LN373">373</td><td class="line"> info->cond.phenomenon = PHENOMENON_TORNADO;</td></tr> +<tr class="codeline" data-linenumber="374"><td class="num" id="LN374">374</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="375"><td class="num" id="LN375">375</td><td class="line"> info->cond.phenomenon = PHENOMENON_FUNNEL_CLOUD;</td></tr> +<tr class="codeline" data-linenumber="376"><td class="num" id="LN376">376</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="377"><td class="num" id="LN377">377</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="378"><td class="num" id="LN378">378</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="379"><td class="num" id="LN379">379</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="380"><td class="num" id="LN380">380</td><td class="line"> <span class='keyword'>if</span> ((info->cond.qualifier != QUALIFIER_NONE) || (info->cond.phenomenon != PHENOMENON_NONE))</td></tr> +<tr class="codeline" data-linenumber="381"><td class="num" id="LN381">381</td><td class="line"> info->cond.significant = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="382"><td class="num" id="LN382">382</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="383"><td class="num" id="LN383">383</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="384"><td class="num" id="LN384">384</td><td class="line"><span class='directive'>#define <span class='macro'>TIME_RE_STR<span class='macro_popup'>"([0-9]{6})Z"</span></span> "([0-9]{6})Z"</span></td></tr> +<tr class="codeline" data-linenumber="385"><td class="num" id="LN385">385</td><td class="line"><span class='directive'>#define <span class='macro'>WIND_RE_STR<span class='macro_popup'>"(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></span> "(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></td></tr> +<tr class="codeline" data-linenumber="386"><td class="num" id="LN386">386</td><td class="line"><span class='directive'>#define <span class='macro'>VIS_RE_STR<span class='macro_popup'>"((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" "([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|"<br> "CAVOK"</span></span> "((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" \</span></td></tr> +<tr class="codeline" data-linenumber="387"><td class="num" id="LN387">387</td><td class="line"> <span class='directive'>"([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|" \</span></td></tr> +<tr class="codeline" data-linenumber="388"><td class="num" id="LN388">388</td><td class="line"> <span class='directive'>"CAVOK"</span></td></tr> +<tr class="codeline" data-linenumber="389"><td class="num" id="LN389">389</td><td class="line"><span class='directive'>#define <span class='macro'>COND_RE_STR<span class='macro_popup'>"(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></span> "(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></td></tr> +<tr class="codeline" data-linenumber="390"><td class="num" id="LN390">390</td><td class="line"><span class='directive'>#define <span class='macro'>CLOUD_RE_STR<span class='macro_popup'>"((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></span> "((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></td></tr> +<tr class="codeline" data-linenumber="391"><td class="num" id="LN391">391</td><td class="line"><span class='directive'>#define <span class='macro'>TEMP_RE_STR<span class='macro_popup'>"(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></span> "(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></td></tr> +<tr class="codeline" data-linenumber="392"><td class="num" id="LN392">392</td><td class="line"><span class='directive'>#define <span class='macro'>PRES_RE_STR<span class='macro_popup'>"(A|Q)([0-9]{4})"</span></span> "(A|Q)([0-9]{4})"</span></td></tr> +<tr class="codeline" data-linenumber="393"><td class="num" id="LN393">393</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="394"><td class="num" id="LN394">394</td><td class="line"><span class='comment'>/* POSIX regular expressions do not allow us to express "match whole words</span></td></tr> +<tr class="codeline" data-linenumber="395"><td class="num" id="LN395">395</td><td class="line"> <span class='comment'>* only" in a simple way, so we have to wrap them all into</span></td></tr> +<tr class="codeline" data-linenumber="396"><td class="num" id="LN396">396</td><td class="line"> <span class='comment'>* (^| )(...regex...)( |$)</span></td></tr> +<tr class="codeline" data-linenumber="397"><td class="num" id="LN397">397</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="398"><td class="num" id="LN398">398</td><td class="line"><span class='directive'>#define <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> "(^| )("</span></td></tr> +<tr class="codeline" data-linenumber="399"><td class="num" id="LN399">399</td><td class="line"><span class='directive'>#define <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span> ")( |$)"</span></td></tr> +<tr class="codeline" data-linenumber="400"><td class="num" id="LN400">400</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="401"><td class="num" id="LN401">401</td><td class="line"><span class='keyword'>static</span> regex_t metar_re[RE_NUM];</td></tr> +<tr class="codeline" data-linenumber="402"><td class="num" id="LN402">402</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> (*metar_f[RE_NUM]) (gchar *tokp, WeatherInfo *info);</td></tr> +<tr class="codeline" data-linenumber="403"><td class="num" id="LN403">403</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="404"><td class="num" id="LN404">404</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="405"><td class="num" id="LN405">405</td><td class="line">metar_init_re (<span class='keyword'>void</span>)</td></tr> +<tr class="codeline" data-linenumber="406"><td class="num" id="LN406">406</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="407"><td class="num" id="LN407">407</td><td class="line"> <span class='keyword'>static</span> gboolean initialized = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="408"><td class="num" id="LN408">408</td><td class="line"> <span class='keyword'>if</span> (initialized)</td></tr> +<tr class="codeline" data-linenumber="409"><td class="num" id="LN409">409</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="410"><td class="num" id="LN410">410</td><td class="line"> initialized = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="411"><td class="num" id="LN411">411</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="412"><td class="num" id="LN412">412</td><td class="line"> regcomp (&metar_re[TIME_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>TIME_RE_STR<span class='macro_popup'>"([0-9]{6})Z"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="413"><td class="num" id="LN413">413</td><td class="line"> regcomp (&metar_re[WIND_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>WIND_RE_STR<span class='macro_popup'>"(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="414"><td class="num" id="LN414">414</td><td class="line"> regcomp (&metar_re[VIS_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>VIS_RE_STR<span class='macro_popup'>"((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" "([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|"<br> "CAVOK"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="415"><td class="num" id="LN415">415</td><td class="line"> regcomp (&metar_re[COND_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>COND_RE_STR<span class='macro_popup'>"(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="416"><td class="num" id="LN416">416</td><td class="line"> regcomp (&metar_re[CLOUD_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>CLOUD_RE_STR<span class='macro_popup'>"((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="417"><td class="num" id="LN417">417</td><td class="line"> regcomp (&metar_re[TEMP_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>TEMP_RE_STR<span class='macro_popup'>"(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="418"><td class="num" id="LN418">418</td><td class="line"> regcomp (&metar_re[PRES_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>PRES_RE_STR<span class='macro_popup'>"(A|Q)([0-9]{4})"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="419"><td class="num" id="LN419">419</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="420"><td class="num" id="LN420">420</td><td class="line"> metar_f[TIME_RE] = metar_tok_time;</td></tr> +<tr class="codeline" data-linenumber="421"><td class="num" id="LN421">421</td><td class="line"> metar_f[WIND_RE] = metar_tok_wind;</td></tr> +<tr class="codeline" data-linenumber="422"><td class="num" id="LN422">422</td><td class="line"> metar_f[VIS_RE] = metar_tok_vis;</td></tr> +<tr class="codeline" data-linenumber="423"><td class="num" id="LN423">423</td><td class="line"> metar_f[COND_RE] = metar_tok_cond;</td></tr> +<tr class="codeline" data-linenumber="424"><td class="num" id="LN424">424</td><td class="line"> metar_f[CLOUD_RE] = metar_tok_cloud;</td></tr> +<tr class="codeline" data-linenumber="425"><td class="num" id="LN425">425</td><td class="line"> metar_f[TEMP_RE] = metar_tok_temp;</td></tr> +<tr class="codeline" data-linenumber="426"><td class="num" id="LN426">426</td><td class="line"> metar_f[PRES_RE] = metar_tok_pres;</td></tr> +<tr class="codeline" data-linenumber="427"><td class="num" id="LN427">427</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="428"><td class="num" id="LN428">428</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="429"><td class="num" id="LN429">429</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="430"><td class="num" id="LN430">430</td><td class="line">metar_parse (gchar *metar, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="431"><td class="num" id="LN431">431</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="432"><td class="num" id="LN432">432</td><td class="line"> gchar *p;</td></tr> +<tr class="codeline" data-linenumber="433"><td class="num" id="LN433">433</td><td class="line"> <span class='comment'>//gchar *rmk;</span></td></tr> +<tr class="codeline" data-linenumber="434"><td class="num" id="LN434">434</td><td class="line"> gint i, i2;</td></tr> +<tr class="codeline" data-linenumber="435"><td class="num" id="LN435">435</td><td class="line"> regmatch_t rm, rm2;</td></tr> +<tr class="codeline" data-linenumber="436"><td class="num" id="LN436">436</td><td class="line"> gchar *tokp;</td></tr> +<tr class="codeline" data-linenumber="437"><td class="num" id="LN437">437</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="438"><td class="num" id="LN438">438</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_18<br>; if (info != ((void*)0)) _g_boolean_var_18 = 1; else _g_boolean_var_18<br> = 0; _g_boolean_var_18; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="439"><td class="num" id="LN439">439</td><td class="line"> <span class='macro'>g_return_val_if_fail (metar != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_19<br>; if (metar != ((void*)0)) _g_boolean_var_19 = 1; else _g_boolean_var_19<br> = 0; _g_boolean_var_19; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "metar != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="440"><td class="num" id="LN440">440</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="441"><td class="num" id="LN441">441</td><td class="line"> metar_init_re ();</td></tr> +<tr class="codeline" data-linenumber="442"><td class="num" id="LN442">442</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="443"><td class="num" id="LN443">443</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="444"><td class="num" id="LN444">444</td><td class="line"> <span class='comment'>* Force parsing to end at "RMK" field. This prevents a subtle</span></td></tr> +<tr class="codeline" data-linenumber="445"><td class="num" id="LN445">445</td><td class="line"> <span class='comment'>* problem when info within the remark happens to match an earlier state</span></td></tr> +<tr class="codeline" data-linenumber="446"><td class="num" id="LN446">446</td><td class="line"> <span class='comment'>* and, as a result, throws off all the remaining expression</span></td></tr> +<tr class="codeline" data-linenumber="447"><td class="num" id="LN447">447</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="448"><td class="num" id="LN448">448</td><td class="line"> <span class='keyword'>if</span> (0 != (p = strstr (metar, <span class='string_literal'>" RMK "</span>))) {</td></tr> +<tr class="codeline" data-linenumber="449"><td class="num" id="LN449">449</td><td class="line"> *p = '\0';</td></tr> +<tr class="codeline" data-linenumber="450"><td class="num" id="LN450">450</td><td class="line"> <span class='comment'>//rmk = p + 5; // uncomment this if RMK data becomes useful</span></td></tr> +<tr class="codeline" data-linenumber="451"><td class="num" id="LN451">451</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="452"><td class="num" id="LN452">452</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="453"><td class="num" id="LN453">453</td><td class="line"> p = metar;</td></tr> +<tr class="codeline" data-linenumber="454"><td class="num" id="LN454">454</td><td class="line"> i = TIME_RE;</td></tr> +<tr class="codeline" data-linenumber="455"><td class="num" id="LN455">455</td><td class="line"> <span class='keyword'>while</span> (*p) {</td></tr> +<tr class="codeline" data-linenumber="456"><td class="num" id="LN456">456</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="457"><td class="num" id="LN457">457</td><td class="line"> i2 = RE_NUM;</td></tr> +<tr class="codeline" data-linenumber="458"><td class="num" id="LN458">458</td><td class="line"> rm2.rm_so = strlen (p);</td></tr> +<tr class="codeline" data-linenumber="459"><td class="num" id="LN459">459</td><td class="line"> rm2.rm_eo = rm2.rm_so;</td></tr> +<tr class="codeline" data-linenumber="460"><td class="num" id="LN460">460</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="461"><td class="num" id="LN461">461</td><td class="line"> <span class='keyword'>for</span> (i = 0; i < RE_NUM && rm2.rm_so > 0; i++) {</td></tr> +<tr class="codeline" data-linenumber="462"><td class="num" id="LN462">462</td><td class="line"> <span class='keyword'>if</span> (0 == regexec (&metar_re[i], p, 1, &rm, 0)</td></tr> +<tr class="codeline" data-linenumber="463"><td class="num" id="LN463">463</td><td class="line"> && rm.rm_so < rm2.rm_so)</td></tr> +<tr class="codeline" data-linenumber="464"><td class="num" id="LN464">464</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="465"><td class="num" id="LN465">465</td><td class="line"> i2 = i;</td></tr> +<tr class="codeline" data-linenumber="466"><td class="num" id="LN466">466</td><td class="line"> <span class='comment'>/* Skip leading and trailing space characters, if present.</span></td></tr> +<tr class="codeline" data-linenumber="467"><td class="num" id="LN467">467</td><td class="line"> <span class='comment'>(the regular expressions include those characters to</span></td></tr> +<tr class="codeline" data-linenumber="468"><td class="num" id="LN468">468</td><td class="line"> <span class='comment'>only get matches limited to whole words). */</span></td></tr> +<tr class="codeline" data-linenumber="469"><td class="num" id="LN469">469</td><td class="line"> <span class='keyword'>if</span> (p[rm.rm_so] == ' ') rm.rm_so++;</td></tr> +<tr class="codeline" data-linenumber="470"><td class="num" id="LN470">470</td><td class="line"> <span class='keyword'>if</span> (p[rm.rm_eo - 1] == ' ') rm.rm_eo--;</td></tr> +<tr class="codeline" data-linenumber="471"><td class="num" id="LN471">471</td><td class="line"> rm2.rm_so = rm.rm_so;</td></tr> +<tr class="codeline" data-linenumber="472"><td class="num" id="LN472">472</td><td class="line"> rm2.rm_eo = rm.rm_eo;</td></tr> +<tr class="codeline" data-linenumber="473"><td class="num" id="LN473">473</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="474"><td class="num" id="LN474">474</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="475"><td class="num" id="LN475">475</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="476"><td class="num" id="LN476">476</td><td class="line"> <span class='keyword'>if</span> (i2 != RE_NUM) {</td></tr> +<tr class="codeline" data-linenumber="477"><td class="num" id="LN477">477</td><td class="line"> tokp = g_strndup (p + rm2.rm_so, rm2.rm_eo - rm2.rm_so);</td></tr> +<tr class="codeline" data-linenumber="478"><td class="num" id="LN478">478</td><td class="line"> metar_f[i2] (tokp, info);</td></tr> +<tr class="codeline" data-linenumber="479"><td class="num" id="LN479">479</td><td class="line"> g_free (tokp);</td></tr> +<tr class="codeline" data-linenumber="480"><td class="num" id="LN480">480</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="481"><td class="num" id="LN481">481</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="482"><td class="num" id="LN482">482</td><td class="line"> p += rm2.rm_eo;</td></tr> +<tr class="codeline" data-linenumber="483"><td class="num" id="LN483">483</td><td class="line"> p += strspn (p, <span class='string_literal'>" "</span>);</td></tr> +<tr class="codeline" data-linenumber="484"><td class="num" id="LN484">484</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="485"><td class="num" id="LN485">485</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="486"><td class="num" id="LN486">486</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="487"><td class="num" id="LN487">487</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="488"><td class="num" id="LN488">488</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="489"><td class="num" id="LN489">489</td><td class="line">metar_finish (SoupSession *session, SoupMessage *msg, gpointer data)</td></tr> +<tr class="codeline" data-linenumber="490"><td class="num" id="LN490">490</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="491"><td class="num" id="LN491">491</td><td class="line"> WeatherInfo *info = (WeatherInfo *)data;</td></tr> +<tr class="codeline" data-linenumber="492"><td class="num" id="LN492">492</td><td class="line"> WeatherLocation *loc;</td></tr> +<tr class="codeline" data-linenumber="493"><td class="num" id="LN493">493</td><td class="line"> <span class='keyword'>const</span> gchar *p, *endtag;</td></tr> +<tr class="codeline" data-linenumber="494"><td class="num" id="LN494">494</td><td class="line"> gchar *searchkey, *metar;</td></tr> +<tr class="codeline" data-linenumber="495"><td class="num" id="LN495">495</td><td class="line"> gboolean success = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="496"><td class="num" id="LN496">496</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="497"><td class="num" id="LN497">497</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_20<br>; if (info != ((void*)0)) _g_boolean_var_20 = 1; else _g_boolean_var_20<br> = 0; _g_boolean_var_20; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="498"><td class="num" id="LN498">498</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="499"><td class="num" id="LN499">499</td><td class="line"> <span class='keyword'>if</span> (!<span class='macro'>SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)<span class='macro_popup'>((msg->status_code) >= 200 && (msg->status_code<br>) < 300)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="500"><td class="num" id="LN500">500</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)<span class='macro_popup'>((msg->status_code) > 0 && (msg->status_code<br>) < 100)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="501"><td class="num" id="LN501">501</td><td class="line"> info->network_error = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="502"><td class="num" id="LN502">502</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="503"><td class="num" id="LN503">503</td><td class="line"> <span class='comment'>/* Translators: %d is an error code, and %s the error string */</span></td></tr> +<tr class="codeline" data-linenumber="504"><td class="num" id="LN504">504</td><td class="line"> g_warning (<span class='macro'>_(<span class='string_literal'>"Failed to get METAR data: %d %s.\n"</span>)<span class='macro_popup'>(mateweather_gettext ("Failed to get METAR data: %d %s.\n"))</span></span>,</td></tr> +<tr class="codeline" data-linenumber="505"><td class="num" id="LN505">505</td><td class="line"> msg->status_code, msg->reason_phrase);</td></tr> +<tr class="codeline" data-linenumber="506"><td class="num" id="LN506">506</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="507"><td class="num" id="LN507">507</td><td class="line"> request_done (info, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="508"><td class="num" id="LN508">508</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="509"><td class="num" id="LN509">509</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="510"><td class="num" id="LN510">510</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="511"><td class="num" id="LN511">511</td><td class="line"> loc = info->location;</td></tr> +<tr class="codeline" data-linenumber="512"><td class="num" id="LN512">512</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="513"><td class="num" id="LN513">513</td><td class="line"> searchkey = g_strdup_printf (<span class='string_literal'>"<raw_text>%s"</span>, loc->code);</td></tr> +<tr class="codeline" data-linenumber="514"><td class="num" id="LN514">514</td><td class="line"> p = strstr (msg->response_body->data, searchkey);</td></tr> +<tr class="codeline" data-linenumber="515"><td class="num" id="LN515">515</td><td class="line"> g_free (searchkey);</td></tr> +<tr class="codeline" data-linenumber="516"><td class="num" id="LN516">516</td><td class="line"> <span class='keyword'>if</span> (p) {</td></tr> +<tr class="codeline" data-linenumber="517"><td class="num" id="LN517">517</td><td class="line"> p += <span class='macro'>WEATHER_LOCATION_CODE_LEN<span class='macro_popup'>4</span></span> + 11;</td></tr> +<tr class="codeline" data-linenumber="518"><td class="num" id="LN518">518</td><td class="line"> endtag = strstr (p, <span class='string_literal'>"</raw_text>"</span>);</td></tr> +<tr class="codeline" data-linenumber="519"><td class="num" id="LN519">519</td><td class="line"> <span class='keyword'>if</span> (endtag)</td></tr> +<tr class="codeline" data-linenumber="520"><td class="num" id="LN520">520</td><td class="line"> metar = g_strndup (p, endtag - p);</td></tr> +<tr class="codeline" data-linenumber="521"><td class="num" id="LN521">521</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="522"><td class="num" id="LN522">522</td><td class="line"> metar = <span class='macro'>g_strdup (p)<span class='macro_popup'>g_strdup_inline (p)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="523"><td class="num" id="LN523">523</td><td class="line"> success = metar_parse (metar, info);</td></tr> +<tr class="codeline" data-linenumber="524"><td class="num" id="LN524">524</td><td class="line"> g_free (metar);</td></tr> +<tr class="codeline" data-linenumber="525"><td class="num" id="LN525">525</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strstr (msg->response_body->data, <span class='string_literal'>"aviationweather.gov"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="526"><td class="num" id="LN526">526</td><td class="line"> <span class='comment'>/* The response doesn't even seem to have come from NOAA...</span></td></tr> +<tr class="codeline" data-linenumber="527"><td class="num" id="LN527">527</td><td class="line"> <span class='comment'>* most likely it is a wifi hotspot login page. Call that a</span></td></tr> +<tr class="codeline" data-linenumber="528"><td class="num" id="LN528">528</td><td class="line"> <span class='comment'>* network error.</span></td></tr> +<tr class="codeline" data-linenumber="529"><td class="num" id="LN529">529</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="530"><td class="num" id="LN530">530</td><td class="line"> info->network_error = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="531"><td class="num" id="LN531">531</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="532"><td class="num" id="LN532">532</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="533"><td class="num" id="LN533">533</td><td class="line"> info->valid = success;</td></tr> +<tr class="codeline" data-linenumber="534"><td class="num" id="LN534">534</td><td class="line"> request_done (info, <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="535"><td class="num" id="LN535">535</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="536"><td class="num" id="LN536">536</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="537"><td class="num" id="LN537">537</td><td class="line"><span class='comment'>/* Read current conditions and fill in info structure */</span></td></tr> +<tr class="codeline" data-linenumber="538"><td class="num" id="LN538">538</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="539"><td class="num" id="LN539">539</td><td class="line">metar_start_open (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="540"><td class="num" id="LN540">540</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="541"><td class="num" id="LN541">541</td><td class="line"> WeatherLocation *loc;</td></tr> +<tr class="codeline" data-linenumber="542"><td class="num" id="LN542">542</td><td class="line"> SoupMessage *msg;</td></tr> +<tr class="codeline" data-linenumber="543"><td class="num" id="LN543">543</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="544"><td class="num" id="LN544">544</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_21<br>; if (info != ((void*)0)) _g_boolean_var_21 = 1; else _g_boolean_var_21<br> = 0; _g_boolean_var_21; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="545"><td class="num" id="LN545">545</td><td class="line"> info->valid = info->network_error = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="546"><td class="num" id="LN546">546</td><td class="line"> loc = info->location;</td></tr> +<tr class="codeline" data-linenumber="547"><td class="num" id="LN547">547</td><td class="line"> <span class='keyword'>if</span> (loc == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="548"><td class="num" id="LN548">548</td><td class="line"> g_warning (<span class='macro'>_(<span class='string_literal'>"WeatherInfo missing location"</span>)<span class='macro_popup'>(mateweather_gettext ("WeatherInfo missing location"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="549"><td class="num" id="LN549">549</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="550"><td class="num" id="LN550">550</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="551"><td class="num" id="LN551">551</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="552"><td class="num" id="LN552">552</td><td class="line"> msg = soup_form_request_new (</td></tr> +<tr class="codeline" data-linenumber="553"><td class="num" id="LN553">553</td><td class="line"> <span class='string_literal'>"GET"</span>, <span class='string_literal'>"https://aviationweather.gov/cgi-bin/data/dataserver.php"</span>,</td></tr> +<tr class="codeline" data-linenumber="554"><td class="num" id="LN554">554</td><td class="line"> <span class='string_literal'>"dataSource"</span>, <span class='string_literal'>"metars"</span>,</td></tr> +<tr class="codeline" data-linenumber="555"><td class="num" id="LN555">555</td><td class="line"> <span class='string_literal'>"requestType"</span>, <span class='string_literal'>"retrieve"</span>,</td></tr> +<tr class="codeline" data-linenumber="556"><td class="num" id="LN556">556</td><td class="line"> <span class='string_literal'>"format"</span>, <span class='string_literal'>"xml"</span>,</td></tr> +<tr class="codeline" data-linenumber="557"><td class="num" id="LN557">557</td><td class="line"> <span class='string_literal'>"hoursBeforeNow"</span>, <span class='string_literal'>"3"</span>,</td></tr> +<tr class="codeline" data-linenumber="558"><td class="num" id="LN558">558</td><td class="line"> <span class='string_literal'>"mostRecent"</span>, <span class='string_literal'>"true"</span>,</td></tr> +<tr class="codeline" data-linenumber="559"><td class="num" id="LN559">559</td><td class="line"> <span class='string_literal'>"fields"</span>, <span class='string_literal'>"raw_text"</span>,</td></tr> +<tr class="codeline" data-linenumber="560"><td class="num" id="LN560">560</td><td class="line"> <span class='string_literal'>"stationString"</span>, loc->code,</td></tr> +<tr class="codeline" data-linenumber="561"><td class="num" id="LN561">561</td><td class="line"> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="562"><td class="num" id="LN562">562</td><td class="line"> soup_session_queue_message (info->session, msg, metar_finish, info);</td></tr> +<tr class="codeline" data-linenumber="563"><td class="num" id="LN563">563</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="564"><td class="num" id="LN564">564</td><td class="line"> info->requests_pending++;</td></tr> +<tr class="codeline" data-linenumber="565"><td class="num" id="LN565">565</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-688a74.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-688a74.html new file mode 100644 index 0000000..2be2058 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-688a74.html @@ -0,0 +1,1029 @@ +<!doctype html> +<html> +<head> +<title>weather-sun.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC This statement is never executed --> + +<!-- BUGTYPE Unreachable code --> + +<!-- BUGCATEGORY Unused code --> + +<!-- BUGFILE /rootdir/libmateweather/weather-sun.c --> + +<!-- FILENAME weather-sun.c --> + +<!-- FUNCTIONNAME weather_info_next_sun_event --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 688a74542b41bc03a5c20d15119e753c --> + +<!-- BUGLINE 335 --> + +<!-- BUGCOLUMN 12 --> + +<!-- BUGPATHLENGTH 1 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather-sun.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 335, column 12</a><br />This statement is never executed</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather-sun.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather-sun.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"335": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather-sun.c - Astronomy calculations for mateweather</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"> <span class='comment'>* Formulas from:</span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"> <span class='comment'>* "Practical Astronomy With Your Calculator" (3e), Peter Duffett-Smith</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> <span class='comment'>* Cambridge University Press 1988</span></td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"> <span class='comment'>* Unless otherwise noted, comments referencing "steps" are related to</span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"> <span class='comment'>* the algorithm presented in section 49 of above</span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"><span class='directive'>#include <math.h></span></td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"><span class='directive'>#include <time.h></span></td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"><span class='directive'>#include <glib.h></span></td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"><span class='directive'>#define <span class='macro'>ECCENTRICITY(d)<span class='macro_popup'>(0.01671123 - (d)/36525.*0.00004392)</span></span> (0.01671123 - (d)/36525.*0.00004392)</span></td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> <span class='comment'>* Ecliptic longitude of the sun at specified time (UT)</span></td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line"> <span class='comment'>* The algoithm is described in section 47 of Duffett-Smith</span></td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> <span class='comment'>* Return value is in radians</span></td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line">gdouble</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line">sunEclipLongitude(time_t t)</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> gdouble ndays, meanAnom, eccenAnom, delta, e, longitude;</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> <span class='comment'>* Start with an estimate based on a fixed daily rate</span></td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> ndays = <span class='macro'>EPOCH_TO_J2000(t)<span class='macro_popup'>((gdouble)(t)-946727935.816)</span></span> / 86400.;</td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> meanAnom = <span class='macro'>DEGREES_TO_RADIANS(MEAN_ECLIPTIC_LONGITUDE(ndays)<span class='macro_popup'>((fmod (((280.46457166 + (ndays)/36525.*35999.37244981) - (282.93768193<br> + (ndays)/36525.*0.32327364)),360.) / 180.) * 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> <span class='macro'>- PERIGEE_LONGITUDE(ndays))<span class='macro_popup'>((fmod (((280.46457166 + (ndays)/36525.*35999.37244981) - (282.93768193<br> + (ndays)/36525.*0.32327364)),360.) / 180.) * 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> <span class='comment'>* Approximate solution of Kepler's equation:</span></td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> <span class='comment'>* Find E which satisfies E - e sin(E) = M (mean anomaly)</span></td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> eccenAnom = meanAnom;</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> e = <span class='macro'>ECCENTRICITY(ndays)<span class='macro_popup'>(0.01671123 - (ndays)/36525.*0.00004392)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> <span class='keyword'>while</span> (1e-12 < fabs( delta = eccenAnom - e * sin(eccenAnom) - meanAnom))</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> eccenAnom -= delta / (1.- e * cos(eccenAnom));</td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"> <span class='comment'>* Earth's longitude on the ecliptic</span></td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"> longitude = fmod( <span class='macro'>DEGREES_TO_RADIANS (PERIGEE_LONGITUDE(ndays))<span class='macro_popup'>((fmod (((282.93768193 + (ndays)/36525.*0.32327364)),360.) / 180.<br>) * 3.14159265358979323846)</span></span></td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line"> + 2. * atan (sqrt ((1.+e)/(1.-e))</td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"> * tan (eccenAnom / 2.)),</td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line"> 2. * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>);</td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line"> <span class='keyword'>if</span> (longitude < 0.) {</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line"> longitude += 2 * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>;</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> <span class='keyword'>return</span> longitude;</td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line"><span class='keyword'>static</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line">ecliptic_obliquity (gdouble time)</td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line"> gdouble jc = <span class='macro'>EPOCH_TO_J2000 (time)<span class='macro_popup'>((gdouble)(time)-946727935.816)</span></span> / (36525. * 86400.);</td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line"> gdouble eclip_secs = (84381.448</td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"> - (46.84024 * jc)</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line"> - (59.e-5 * jc * jc)</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line"> + (1.813e-3 * jc * jc * jc));</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DEGREES_TO_RADIANS(eclip_secs / 3600.)<span class='macro_popup'>((fmod ((eclip_secs / 3600.),360.) / 180.) * 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> <span class='comment'>* Convert ecliptic longitude and latitude (radians) to equitorial</span></td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> <span class='comment'>* coordinates, expressed as right ascension (hours) and</span></td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> <span class='comment'>* declination (radians)</span></td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line">ecl2equ (gdouble time,</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> gdouble eclipLon, gdouble eclipLat,</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> gdouble *ra, gdouble *decl)</td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> gdouble mEclipObliq = ecliptic_obliquity(time);</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> <span class='keyword'>if</span> (ra) {</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> *ra = <span class='macro'>RADIANS_TO_HOURS (atan2 ((sin (eclipLon) * cos (mEclipObliq)<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> <span class='macro'>- tan (eclipLat) * sin(mEclipObliq)),<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> <span class='macro'>cos (eclipLon)))<span class='macro_popup'>((atan2 ((sin (eclipLon) * cos (mEclipObliq) - tan (eclipLat)<br> * sin(mEclipObliq)), cos (eclipLon))) * 12. / 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> <span class='keyword'>if</span> (*ra < 0.)</td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> *ra += 24.;</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> <span class='keyword'>if</span> (decl) {</td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line"> *decl = asin (( sin (eclipLat) * cos (mEclipObliq))</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> + cos (eclipLat) * sin (mEclipObliq) * sin(eclipLon));</td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> <span class='comment'>* Calculate rising and setting times for an object</span></td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line"> <span class='comment'>* based on it equitorial coordinates (section 33 & 15)</span></td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line"> <span class='comment'>* Returned "rise" and "set" values are sideral times in hours</span></td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line">gstObsv (gdouble ra, gdouble decl,</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> gdouble obsLat, gdouble obsLon,</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line"> gdouble *rise, gdouble *set)</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> <span class='keyword'>double</span> a = acos (-tan (obsLat) * tan (decl));</td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> <span class='keyword'>double</span> b;</td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>isnan (a)<span class='macro_popup'>__builtin_isnan (a)</span></span> != 0) {</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> *set = *rise = a;</td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> a = <span class='macro'>RADIANS_TO_HOURS (a)<span class='macro_popup'>((a) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> b = 24. - a + ra;</td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> a += ra;</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> a -= <span class='macro'>RADIANS_TO_HOURS (obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> b -= <span class='macro'>RADIANS_TO_HOURS (obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> <span class='keyword'>if</span> ((a = fmod (a, 24.)) < 0)</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> a += 24.;</td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> <span class='keyword'>if</span> ((b = fmod (b, 24.)) < 0)</td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line"> b += 24.;</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"> *set = a;</td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line"> *rise = b;</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"><span class='keyword'>static</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line">t0 (time_t date)</td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> gdouble t = ((gdouble)(<span class='macro'>EPOCH_TO_J2000 (date)<span class='macro_popup'>((gdouble)(date)-946727935.816)</span></span> / 86400)) / 36525.0;</td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> gdouble t0 = fmod (6.697374558 + 2400.051366 * t + 2.5862e-5 * t * t, 24.);</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> <span class='keyword'>if</span> (t0 < 0.)</td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> t0 += 24.;</td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> <span class='keyword'>return</span> t0;</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line">calc_sun2 (WeatherInfo *info, time_t t)</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> gdouble obsLat = info->location->latitude;</td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"> gdouble obsLon = info->location->longitude;</td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line"> time_t gm_midn;</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line"> time_t lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> gdouble gm_hoff, lambda;</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> gdouble ra1, ra2;</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> gdouble decl1, decl2;</td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> gdouble decl_midn, decl_noon;</td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> gdouble rise1, rise2;</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> gdouble set1, set2;</td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> gdouble tt, t00;</td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> gdouble x, u, dt;</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> <span class='comment'>/* Approximate preceding local midnight at observer's longitude */</span></td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> obsLat = info->location->latitude;</td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> obsLon = info->location->longitude;</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line"> gm_midn = t - (t % 86400);</td></tr> +<tr class="codeline" data-linenumber="179"><td class="num" id="LN179">179</td><td class="line"> gm_hoff = floor ((<span class='macro'>RADIANS_TO_DEGREES (obsLon)<span class='macro_popup'>((obsLon) * 180. / 3.14159265358979323846)</span></span> + 7.5) / 15.);</td></tr> +<tr class="codeline" data-linenumber="180"><td class="num" id="LN180">180</td><td class="line"> lcl_midn = gm_midn - 3600. * gm_hoff;</td></tr> +<tr class="codeline" data-linenumber="181"><td class="num" id="LN181">181</td><td class="line"> <span class='keyword'>if</span> (t - lcl_midn >= 86400)</td></tr> +<tr class="codeline" data-linenumber="182"><td class="num" id="LN182">182</td><td class="line"> lcl_midn += 86400;</td></tr> +<tr class="codeline" data-linenumber="183"><td class="num" id="LN183">183</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (lcl_midn > t)</td></tr> +<tr class="codeline" data-linenumber="184"><td class="num" id="LN184">184</td><td class="line"> lcl_midn -= 86400;</td></tr> +<tr class="codeline" data-linenumber="185"><td class="num" id="LN185">185</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="186"><td class="num" id="LN186">186</td><td class="line"> lambda = sunEclipLongitude (lcl_midn);</td></tr> +<tr class="codeline" data-linenumber="187"><td class="num" id="LN187">187</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="188"><td class="num" id="LN188">188</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="189"><td class="num" id="LN189">189</td><td class="line"> <span class='comment'>* Calculate equitorial coordinates of sun at previous</span></td></tr> +<tr class="codeline" data-linenumber="190"><td class="num" id="LN190">190</td><td class="line"> <span class='comment'>* and next local midnights</span></td></tr> +<tr class="codeline" data-linenumber="191"><td class="num" id="LN191">191</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="192"><td class="num" id="LN192">192</td><td class="line"> ecl2equ (lcl_midn, lambda, 0., &ra1, &decl1);</td></tr> +<tr class="codeline" data-linenumber="193"><td class="num" id="LN193">193</td><td class="line"> ecl2equ (lcl_midn + 86400.,</td></tr> +<tr class="codeline" data-linenumber="194"><td class="num" id="LN194">194</td><td class="line"> lambda + <span class='macro'>DEGREES_TO_RADIANS(SOL_PROGRESSION)<span class='macro_popup'>((fmod (((360./365.242191)),360.) / 180.) * 3.14159265358979323846<br>)</span></span>, 0.,</td></tr> +<tr class="codeline" data-linenumber="195"><td class="num" id="LN195">195</td><td class="line"> &ra2, &decl2);</td></tr> +<tr class="codeline" data-linenumber="196"><td class="num" id="LN196">196</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="197"><td class="num" id="LN197">197</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="198"><td class="num" id="LN198">198</td><td class="line"> <span class='comment'>* If the observer is within the Arctic or Antarctic Circles then</span></td></tr> +<tr class="codeline" data-linenumber="199"><td class="num" id="LN199">199</td><td class="line"> <span class='comment'>* the sun may be above or below the horizon for the full day.</span></td></tr> +<tr class="codeline" data-linenumber="200"><td class="num" id="LN200">200</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="201"><td class="num" id="LN201">201</td><td class="line"> decl_midn = <span class='macro'>MIN(decl1,decl2)<span class='macro_popup'>(((decl1) < (decl2)) ? (decl1) : (decl2))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="202"><td class="num" id="LN202">202</td><td class="line"> decl_noon = (decl1+decl2)/2.;</td></tr> +<tr class="codeline" data-linenumber="203"><td class="num" id="LN203">203</td><td class="line"> info->midnightSun =</td></tr> +<tr class="codeline" data-linenumber="204"><td class="num" id="LN204">204</td><td class="line"> (obsLat > (<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.-decl_midn)) || (obsLat < (-<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.-decl_midn));</td></tr> +<tr class="codeline" data-linenumber="205"><td class="num" id="LN205">205</td><td class="line"> info->polarNight =</td></tr> +<tr class="codeline" data-linenumber="206"><td class="num" id="LN206">206</td><td class="line"> (obsLat > (<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.+decl_noon)) || (obsLat < (-<span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span>/2.+decl_noon));</td></tr> +<tr class="codeline" data-linenumber="207"><td class="num" id="LN207">207</td><td class="line"> <span class='keyword'>if</span> (info->midnightSun || info->polarNight) {</td></tr> +<tr class="codeline" data-linenumber="208"><td class="num" id="LN208">208</td><td class="line"> info->sunriseValid = info->sunsetValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="209"><td class="num" id="LN209">209</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="210"><td class="num" id="LN210">210</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="211"><td class="num" id="LN211">211</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="212"><td class="num" id="LN212">212</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="213"><td class="num" id="LN213">213</td><td class="line"> <span class='comment'>* Convert to rise and set times based positions for the preceding</span></td></tr> +<tr class="codeline" data-linenumber="214"><td class="num" id="LN214">214</td><td class="line"> <span class='comment'>* and following local midnights.</span></td></tr> +<tr class="codeline" data-linenumber="215"><td class="num" id="LN215">215</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="216"><td class="num" id="LN216">216</td><td class="line"> gstObsv (ra1, decl1, obsLat, obsLon - (gm_hoff * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span> / 12.), &rise1, &set1);</td></tr> +<tr class="codeline" data-linenumber="217"><td class="num" id="LN217">217</td><td class="line"> gstObsv (ra2, decl2, obsLat, obsLon - (gm_hoff * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span> / 12.), &rise2, &set2);</td></tr> +<tr class="codeline" data-linenumber="218"><td class="num" id="LN218">218</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="219"><td class="num" id="LN219">219</td><td class="line"> <span class='comment'>/* TODO: include calculations for regions near the poles. */</span></td></tr> +<tr class="codeline" data-linenumber="220"><td class="num" id="LN220">220</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>isnan(rise1)<span class='macro_popup'>__builtin_isnan (rise1)</span></span> || <span class='macro'>isnan(rise2)<span class='macro_popup'>__builtin_isnan (rise2)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="221"><td class="num" id="LN221">221</td><td class="line"> info->sunriseValid = info->sunsetValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="222"><td class="num" id="LN222">222</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="223"><td class="num" id="LN223">223</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="224"><td class="num" id="LN224">224</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="225"><td class="num" id="LN225">225</td><td class="line"> <span class='keyword'>if</span> (rise2 < rise1) {</td></tr> +<tr class="codeline" data-linenumber="226"><td class="num" id="LN226">226</td><td class="line"> rise2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="227"><td class="num" id="LN227">227</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="228"><td class="num" id="LN228">228</td><td class="line"> <span class='keyword'>if</span> (set2 < set1) {</td></tr> +<tr class="codeline" data-linenumber="229"><td class="num" id="LN229">229</td><td class="line"> set2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="230"><td class="num" id="LN230">230</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="231"><td class="num" id="LN231">231</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="232"><td class="num" id="LN232">232</td><td class="line"> tt = t0(lcl_midn);</td></tr> +<tr class="codeline" data-linenumber="233"><td class="num" id="LN233">233</td><td class="line"> t00 = tt - (gm_hoff + <span class='macro'>RADIANS_TO_HOURS(obsLon)<span class='macro_popup'>((obsLon) * 12. / 3.14159265358979323846)</span></span>) * 1.002737909;</td></tr> +<tr class="codeline" data-linenumber="234"><td class="num" id="LN234">234</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="235"><td class="num" id="LN235">235</td><td class="line"> <span class='keyword'>if</span> (t00 < 0.)</td></tr> +<tr class="codeline" data-linenumber="236"><td class="num" id="LN236">236</td><td class="line"> t00 += 24.;</td></tr> +<tr class="codeline" data-linenumber="237"><td class="num" id="LN237">237</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="238"><td class="num" id="LN238">238</td><td class="line"> <span class='keyword'>if</span> (rise1 < t00) {</td></tr> +<tr class="codeline" data-linenumber="239"><td class="num" id="LN239">239</td><td class="line"> rise1 += 24.;</td></tr> +<tr class="codeline" data-linenumber="240"><td class="num" id="LN240">240</td><td class="line"> rise2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="241"><td class="num" id="LN241">241</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="242"><td class="num" id="LN242">242</td><td class="line"> <span class='keyword'>if</span> (set1 < t00) {</td></tr> +<tr class="codeline" data-linenumber="243"><td class="num" id="LN243">243</td><td class="line"> set1 += 24.;</td></tr> +<tr class="codeline" data-linenumber="244"><td class="num" id="LN244">244</td><td class="line"> set2 += 24.;</td></tr> +<tr class="codeline" data-linenumber="245"><td class="num" id="LN245">245</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="246"><td class="num" id="LN246">246</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="247"><td class="num" id="LN247">247</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="248"><td class="num" id="LN248">248</td><td class="line"> <span class='comment'>* Interpolate between the two to get a rise and set time</span></td></tr> +<tr class="codeline" data-linenumber="249"><td class="num" id="LN249">249</td><td class="line"> <span class='comment'>* based on the sun's position at local noon (step 8)</span></td></tr> +<tr class="codeline" data-linenumber="250"><td class="num" id="LN250">250</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="251"><td class="num" id="LN251">251</td><td class="line"> rise1 = (24.07 * rise1 - t00 * (rise2 - rise1)) / (24.07 + rise1 - rise2);</td></tr> +<tr class="codeline" data-linenumber="252"><td class="num" id="LN252">252</td><td class="line"> set1 = (24.07 * set1 - t00 * (set2 - set1)) / (24.07 + set1 - set2);</td></tr> +<tr class="codeline" data-linenumber="253"><td class="num" id="LN253">253</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="254"><td class="num" id="LN254">254</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="255"><td class="num" id="LN255">255</td><td class="line"> <span class='comment'>* Calculate an adjustment value to account for parallax,</span></td></tr> +<tr class="codeline" data-linenumber="256"><td class="num" id="LN256">256</td><td class="line"> <span class='comment'>* refraction and the Sun's finite diameter (steps 9,10)</span></td></tr> +<tr class="codeline" data-linenumber="257"><td class="num" id="LN257">257</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="258"><td class="num" id="LN258">258</td><td class="line"> decl2 = (decl1 + decl2) / 2.;</td></tr> +<tr class="codeline" data-linenumber="259"><td class="num" id="LN259">259</td><td class="line"> x = <span class='macro'>DEGREES_TO_RADIANS(0.830725)<span class='macro_popup'>((fmod ((0.830725),360.) / 180.) * 3.14159265358979323846)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="260"><td class="num" id="LN260">260</td><td class="line"> u = acos ( sin(obsLat) / cos(decl2) );</td></tr> +<tr class="codeline" data-linenumber="261"><td class="num" id="LN261">261</td><td class="line"> dt = <span class='macro'>RADIANS_TO_HOURS ( asin ( sin(x) / sin(u) ) / cos(decl2) )<span class='macro_popup'>((asin ( sin(x) / sin(u) ) / cos(decl2)) * 12. / 3.14159265358979323846<br>)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="262"><td class="num" id="LN262">262</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="263"><td class="num" id="LN263">263</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="264"><td class="num" id="LN264">264</td><td class="line"> <span class='comment'>* Subtract the correction value from sunrise and add to sunset,</span></td></tr> +<tr class="codeline" data-linenumber="265"><td class="num" id="LN265">265</td><td class="line"> <span class='comment'>* then (step 11) convert sideral times to UT</span></td></tr> +<tr class="codeline" data-linenumber="266"><td class="num" id="LN266">266</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="267"><td class="num" id="LN267">267</td><td class="line"> rise1 = (rise1 - dt - tt) * 0.9972695661;</td></tr> +<tr class="codeline" data-linenumber="268"><td class="num" id="LN268">268</td><td class="line"> <span class='keyword'>if</span> (rise1 < 0.)</td></tr> +<tr class="codeline" data-linenumber="269"><td class="num" id="LN269">269</td><td class="line"> rise1 += 24;</td></tr> +<tr class="codeline" data-linenumber="270"><td class="num" id="LN270">270</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (rise1 >= 24.)</td></tr> +<tr class="codeline" data-linenumber="271"><td class="num" id="LN271">271</td><td class="line"> rise1 -= 24.;</td></tr> +<tr class="codeline" data-linenumber="272"><td class="num" id="LN272">272</td><td class="line"> info->sunriseValid = ((rise1 >= 0.) && (rise1 < 24.));</td></tr> +<tr class="codeline" data-linenumber="273"><td class="num" id="LN273">273</td><td class="line"> info->sunrise = (rise1 * 3600.) + lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="274"><td class="num" id="LN274">274</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="275"><td class="num" id="LN275">275</td><td class="line"> set1 = (set1 + dt - tt) * 0.9972695661;</td></tr> +<tr class="codeline" data-linenumber="276"><td class="num" id="LN276">276</td><td class="line"> <span class='keyword'>if</span> (set1 < 0.)</td></tr> +<tr class="codeline" data-linenumber="277"><td class="num" id="LN277">277</td><td class="line"> set1 += 24;</td></tr> +<tr class="codeline" data-linenumber="278"><td class="num" id="LN278">278</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (set1 >= 24.)</td></tr> +<tr class="codeline" data-linenumber="279"><td class="num" id="LN279">279</td><td class="line"> set1 -= 24.;</td></tr> +<tr class="codeline" data-linenumber="280"><td class="num" id="LN280">280</td><td class="line"> info->sunsetValid = ((set1 >= 0.) && (set1 < 24.));</td></tr> +<tr class="codeline" data-linenumber="281"><td class="num" id="LN281">281</td><td class="line"> info->sunset = (set1 * 3600.) + lcl_midn;</td></tr> +<tr class="codeline" data-linenumber="282"><td class="num" id="LN282">282</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="283"><td class="num" id="LN283">283</td><td class="line"> <span class='keyword'>return</span> (info->sunriseValid || info->sunsetValid);</td></tr> +<tr class="codeline" data-linenumber="284"><td class="num" id="LN284">284</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="285"><td class="num" id="LN285">285</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="286"><td class="num" id="LN286">286</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="287"><td class="num" id="LN287">287</td><td class="line"> <span class='comment'>* calc_sun_time:</span></td></tr> +<tr class="codeline" data-linenumber="288"><td class="num" id="LN288">288</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure containing the observer's latitude</span></td></tr> +<tr class="codeline" data-linenumber="289"><td class="num" id="LN289">289</td><td class="line"> <span class='comment'>* and longitude in radians, fills in the sunrise and sunset times.</span></td></tr> +<tr class="codeline" data-linenumber="290"><td class="num" id="LN290">290</td><td class="line"> <span class='comment'>* @t: time_t</span></td></tr> +<tr class="codeline" data-linenumber="291"><td class="num" id="LN291">291</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="292"><td class="num" id="LN292">292</td><td class="line"> <span class='comment'>* Returns: gboolean indicating if the results are valid.</span></td></tr> +<tr class="codeline" data-linenumber="293"><td class="num" id="LN293">293</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="294"><td class="num" id="LN294">294</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="295"><td class="num" id="LN295">295</td><td class="line">calc_sun_time (WeatherInfo *info, time_t t)</td></tr> +<tr class="codeline" data-linenumber="296"><td class="num" id="LN296">296</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="297"><td class="num" id="LN297">297</td><td class="line"> <span class='keyword'>return</span> info->location->latlon_valid && calc_sun2 (info, t);</td></tr> +<tr class="codeline" data-linenumber="298"><td class="num" id="LN298">298</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="299"><td class="num" id="LN299">299</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="300"><td class="num" id="LN300">300</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="301"><td class="num" id="LN301">301</td><td class="line"> <span class='comment'>* calc_sun:</span></td></tr> +<tr class="codeline" data-linenumber="302"><td class="num" id="LN302">302</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure containing the observer's latitude</span></td></tr> +<tr class="codeline" data-linenumber="303"><td class="num" id="LN303">303</td><td class="line"> <span class='comment'>* and longitude in radians, fills in the sunrise and sunset times.</span></td></tr> +<tr class="codeline" data-linenumber="304"><td class="num" id="LN304">304</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="305"><td class="num" id="LN305">305</td><td class="line"> <span class='comment'>* Returns: gboolean indicating if the results are valid.</span></td></tr> +<tr class="codeline" data-linenumber="306"><td class="num" id="LN306">306</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="307"><td class="num" id="LN307">307</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="308"><td class="num" id="LN308">308</td><td class="line">calc_sun (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="309"><td class="num" id="LN309">309</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="310"><td class="num" id="LN310">310</td><td class="line"> <span class='keyword'>return</span> calc_sun_time(info, time(<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>));</td></tr> +<tr class="codeline" data-linenumber="311"><td class="num" id="LN311">311</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="312"><td class="num" id="LN312">312</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="313"><td class="num" id="LN313">313</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="314"><td class="num" id="LN314">314</td><td class="line"> <span class='comment'>* weather_info_next_sun_event:</span></td></tr> +<tr class="codeline" data-linenumber="315"><td class="num" id="LN315">315</td><td class="line"> <span class='comment'>* @info: #WeatherInfo structure</span></td></tr> +<tr class="codeline" data-linenumber="316"><td class="num" id="LN316">316</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="317"><td class="num" id="LN317">317</td><td class="line"> <span class='comment'>* Returns: the interval, in seconds, until the next "sun event":</span></td></tr> +<tr class="codeline" data-linenumber="318"><td class="num" id="LN318">318</td><td class="line"> <span class='comment'>* - local midnight, when rise and set times are recomputed</span></td></tr> +<tr class="codeline" data-linenumber="319"><td class="num" id="LN319">319</td><td class="line"> <span class='comment'>* - next sunrise, when icon changes to daytime version</span></td></tr> +<tr class="codeline" data-linenumber="320"><td class="num" id="LN320">320</td><td class="line"> <span class='comment'>* - next sunset, when icon changes to nighttime version</span></td></tr> +<tr class="codeline" data-linenumber="321"><td class="num" id="LN321">321</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="322"><td class="num" id="LN322">322</td><td class="line">gint</td></tr> +<tr class="codeline" data-linenumber="323"><td class="num" id="LN323">323</td><td class="line">weather_info_next_sun_event (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="324"><td class="num" id="LN324">324</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="325"><td class="num" id="LN325">325</td><td class="line"> time_t now = time (<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="326"><td class="num" id="LN326">326</td><td class="line"> <span class='keyword'>struct</span> tm ltm;</td></tr> +<tr class="codeline" data-linenumber="327"><td class="num" id="LN327">327</td><td class="line"> time_t nxtEvent;</td></tr> +<tr class="codeline" data-linenumber="328"><td class="num" id="LN328">328</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="329"><td class="num" id="LN329">329</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, -1)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_13<br>; if (info != ((void*)0)) _g_boolean_var_13 = 1; else _g_boolean_var_13<br> = 0; _g_boolean_var_13; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (-1); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="330"><td class="num" id="LN330">330</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="331"><td class="num" id="LN331">331</td><td class="line"> <span class='keyword'>if</span> (!calc_sun (info))</td></tr> +<tr class="codeline" data-linenumber="332"><td class="num" id="LN332">332</td><td class="line"> <span class='keyword'>return</span> -1;</td></tr> +<tr class="codeline" data-linenumber="333"><td class="num" id="LN333">333</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="334"><td class="num" id="LN334">334</td><td class="line"> <span class='comment'>/* Determine when the next local midnight occurs */</span></td></tr> +<tr class="codeline" data-linenumber="335"><td class="num" id="LN335">335</td><td class="line"> (<span class='keyword'>void</span>) <span class="mrange">localtime_r</span> (&now, &ltm);</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:12ex">This statement is never executed</div></td></tr> +<tr class="codeline" data-linenumber="336"><td class="num" id="LN336">336</td><td class="line"> ltm.tm_sec = 0;</td></tr> +<tr class="codeline" data-linenumber="337"><td class="num" id="LN337">337</td><td class="line"> ltm.tm_min = 0;</td></tr> +<tr class="codeline" data-linenumber="338"><td class="num" id="LN338">338</td><td class="line"> ltm.tm_hour = 0;</td></tr> +<tr class="codeline" data-linenumber="339"><td class="num" id="LN339">339</td><td class="line"> ltm.tm_mday++;</td></tr> +<tr class="codeline" data-linenumber="340"><td class="num" id="LN340">340</td><td class="line"> nxtEvent = mktime (&ltm);</td></tr> +<tr class="codeline" data-linenumber="341"><td class="num" id="LN341">341</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="342"><td class="num" id="LN342">342</td><td class="line"> <span class='keyword'>if</span> (info->sunsetValid &&</td></tr> +<tr class="codeline" data-linenumber="343"><td class="num" id="LN343">343</td><td class="line"> (info->sunset > now) && (info->sunset < nxtEvent))</td></tr> +<tr class="codeline" data-linenumber="344"><td class="num" id="LN344">344</td><td class="line"> nxtEvent = info->sunset;</td></tr> +<tr class="codeline" data-linenumber="345"><td class="num" id="LN345">345</td><td class="line"> <span class='keyword'>if</span> (info->sunriseValid &&</td></tr> +<tr class="codeline" data-linenumber="346"><td class="num" id="LN346">346</td><td class="line"> (info->sunrise > now) && (info->sunrise < nxtEvent))</td></tr> +<tr class="codeline" data-linenumber="347"><td class="num" id="LN347">347</td><td class="line"> nxtEvent = info->sunrise;</td></tr> +<tr class="codeline" data-linenumber="348"><td class="num" id="LN348">348</td><td class="line"> <span class='keyword'>return</span> (gint)(nxtEvent - now);</td></tr> +<tr class="codeline" data-linenumber="349"><td class="num" id="LN349">349</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-72c2f8.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-72c2f8.html new file mode 100644 index 0000000..2750cc2 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-72c2f8.html @@ -0,0 +1,2352 @@ +<!doctype html> +<html> +<head> +<title>weather.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Value stored to 'location' is never read --> + +<!-- BUGTYPE Dead assignment --> + +<!-- BUGCATEGORY Unused code --> + +<!-- BUGFILE /rootdir/libmateweather/weather.c --> + +<!-- FILENAME weather.c --> + +<!-- FUNCTIONNAME _weather_info_fill --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 72c2f8d42c1e38e4236e1a37bce64cdc --> + +<!-- BUGLINE 495 --> + +<!-- BUGCOLUMN 9 --> + +<!-- BUGPATHLENGTH 1 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 495, column 9</a><br />Value stored to 'location' is never read</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"495": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather.c - Overall weather server functions</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"><span class='directive'>#include <stdio.h></span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"><span class='directive'>#include <stdlib.h></span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"><span class='directive'>#include <assert.h></span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"><span class='directive'>#include <string.h></span></td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"><span class='directive'>#include <ctype.h></span></td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#include <math.h></span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#include <fenv.h></span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"><span class='directive'>#ifdef HAVE_VALUES_H</span></td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"><span class='directive'>#include <values.h></span></td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"><span class='directive'>#include <time.h></span></td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"><span class='directive'>#include <unistd.h></span></td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"><span class='directive'>#include <gdk-pixbuf/gdk-pixbuf.h></span></td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"><span class='directive'>#include "weather.h"</span></td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"><span class='directive'>#define <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span> 36</span></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line"> <span class='comment'>* SECTION:weather</span></td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> <span class='comment'>* @Title: weather</span></td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> _weather_internal_check (<span class='keyword'>void</span>);</td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>inline</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line">mateweather_gettext_init (<span class='keyword'>void</span>)</td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> <span class='keyword'>static</span> gsize mateweather_gettext_initialized = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>G_UNLIKELY (g_once_init_enter (&mateweather_gettext_initialized))<span class='macro_popup'>(__builtin_expect (__extension__ ({ int _g_boolean_var_79; if<br> ((__extension__ ({ _Static_assert (sizeof *(&mateweather_gettext_initialized<br>) == sizeof (gpointer), "Expression evaluates to false"); (void<br>) (0 ? (gpointer) *(&mateweather_gettext_initialized) : (<br>(void*)0)); (!(__extension__ ({ _Static_assert (sizeof *(&<br>mateweather_gettext_initialized) == sizeof (gpointer), "Expression evaluates to false"<br>); __typeof__ (*(&mateweather_gettext_initialized)) gapg_temp_newval<br>; __typeof__ ((&mateweather_gettext_initialized)) gapg_temp_atomic<br> = (&mateweather_gettext_initialized); __atomic_load (gapg_temp_atomic<br>, &gapg_temp_newval, 5); gapg_temp_newval; })) &&<br> g_once_init_enter (&mateweather_gettext_initialized)); }<br>))) _g_boolean_var_79 = 1; else _g_boolean_var_79 = 0; _g_boolean_var_79<br>; }), 0))</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> bindtextdomain (<span class='macro'>GETTEXT_PACKAGE<span class='macro_popup'>"libmateweather"</span></span>, <span class='macro'>MATELOCALEDIR<span class='macro_popup'>"/usr/local/share/locale"</span></span>);</td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"><span class='directive'>#ifdef HAVE_BIND_TEXTDOMAIN_CODESET</span></td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> bind_textdomain_codeset (<span class='macro'>GETTEXT_PACKAGE<span class='macro_popup'>"libmateweather"</span></span>, <span class='string_literal'>"UTF-8"</span>);</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> <span class='macro'>g_once_init_leave (&mateweather_gettext_initialized, TRUE)<span class='macro_popup'>(__extension__ ({ _Static_assert (sizeof *(&mateweather_gettext_initialized<br>) == sizeof (gpointer), "Expression evaluates to false"); 0 ?<br> (void) (*(&mateweather_gettext_initialized) = ((!(0)))) :<br> (void) 0; g_once_init_leave ((&mateweather_gettext_initialized<br>), (gsize) ((!(0)))); }))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"><span class='keyword'>const</span> <span class='keyword'>char</span> *</td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line">mateweather_gettext (<span class='keyword'>const</span> <span class='keyword'>char</span> *str)</td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"> mateweather_gettext_init ();</td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>dgettext (GETTEXT_PACKAGE, str)<span class='macro_popup'>dcgettext ("libmateweather", str, 5)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"><span class='keyword'>const</span> <span class='keyword'>char</span> *</td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line">mateweather_dpgettext (<span class='keyword'>const</span> <span class='keyword'>char</span> *context,</td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line"> <span class='keyword'>const</span> <span class='keyword'>char</span> *str)</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> mateweather_gettext_init ();</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> <span class='keyword'>return</span> g_dpgettext2 (<span class='macro'>GETTEXT_PACKAGE<span class='macro_popup'>"libmateweather"</span></span>, context, str);</td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line"> <span class='comment'>* Convert string of the form "DD-MM-SSH" to radians</span></td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line"> <span class='comment'>* DD:degrees (to 3 digits), MM:minutes, SS:seconds H:hemisphere (NESW)</span></td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line"> <span class='comment'>* Return value is positive for N,E; negative for S,W.</span></td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"><span class='keyword'>static</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line">dmsh2rad (<span class='keyword'>const</span> gchar *latlon)</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> <span class='keyword'>char</span> *p1, *p2;</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line"> <span class='keyword'>int</span> deg, min, sec, dir;</td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> gdouble value;</td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> <span class='keyword'>if</span> (latlon == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> p1 = strchr (latlon, '-');</td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> p2 = strrchr (latlon, '-');</td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"> <span class='keyword'>if</span> (p1 == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span> || p1 == latlon) {</td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (p1 == p2) {</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> sscanf (latlon, <span class='string_literal'>"%d-%d"</span>, &deg, &min);</td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line"> sec = 0;</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (p2 == 1 + p1) {</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> sscanf (latlon, <span class='string_literal'>"%d-%d-%d"</span>, &deg, &min, &sec);</td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> <span class='keyword'>if</span> (deg > 180 || min >= 60 || sec >= 60)</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> value = (gdouble)((deg * 60 + min) * 60 + sec) * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span> / 648000.;</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> dir = g_ascii_toupper (latlon[strlen (latlon) - 1]);</td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line"> <span class='keyword'>if</span> (dir == 'W' || dir == 'S')</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> value = -value;</td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (dir != 'E' && dir != 'N' && (value != 0.0 || dir != '0'))</td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line"> value = <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> <span class='keyword'>return</span> value;</td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line">WeatherLocation *</td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line">weather_location_new (<span class='keyword'>const</span> gchar *name, <span class='keyword'>const</span> gchar *code,</td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line"> <span class='keyword'>const</span> gchar *zone, <span class='keyword'>const</span> gchar *radar,</td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line"> <span class='keyword'>const</span> gchar *coordinates,</td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line"> <span class='keyword'>const</span> gchar *country_code,</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> <span class='keyword'>const</span> gchar *tz_hint)</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line"> WeatherLocation *location;</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> _weather_internal_check ();</td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> location = <span class='macro'>g_new (WeatherLocation, 1)<span class='macro_popup'>(WeatherLocation *) (__extension__ ({ gsize __n = (gsize) (1)<br>; gsize __s = sizeof (WeatherLocation); gpointer __p; if (__s<br> == 1) __p = g_malloc (__n); else if (__builtin_constant_p (__n<br>) && (__s == 0 || __n <= (9223372036854775807L *2UL<br>+1UL) / __s)) __p = g_malloc (__n * __s); else __p = g_malloc_n<br> (__n, __s); __p; }))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> <span class='comment'>/* name and metar code must be set */</span></td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> location->name = <span class='macro'>g_strdup (name)<span class='macro_popup'>g_strdup_inline (name)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> location->code = <span class='macro'>g_strdup (code)<span class='macro_popup'>g_strdup_inline (code)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> <span class='keyword'>if</span> (zone) {</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> location->zone = <span class='macro'>g_strdup (zone)<span class='macro_popup'>g_strdup_inline (zone)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> location->zone = <span class='macro'>g_strdup (<span class='string_literal'>"------"</span>)<span class='macro_popup'>g_strdup_inline ("------")</span></span>;</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line"> <span class='keyword'>if</span> (radar) {</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> location->radar = <span class='macro'>g_strdup (radar)<span class='macro_popup'>g_strdup_inline (radar)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line"> location->radar = <span class='macro'>g_strdup (<span class='string_literal'>"---"</span>)<span class='macro_popup'>g_strdup_inline ("---")</span></span>;</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"> <span class='keyword'>if</span> (location->zone[0] == '-') {</td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line"> location->zone_valid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> location->zone_valid = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> location->coordinates = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> <span class='keyword'>if</span> (coordinates)</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> <span class='keyword'>char</span> **pieces;</td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line"> pieces = g_strsplit (coordinates, <span class='string_literal'>" "</span>, -1);</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> <span class='keyword'>if</span> (g_strv_length (pieces) == 2)</td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line"> location->coordinates = <span class='macro'>g_strdup (coordinates)<span class='macro_popup'>g_strdup_inline (coordinates)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line"> location->latitude = dmsh2rad (pieces[0]);</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> location->longitude = dmsh2rad (pieces[1]);</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> g_strfreev (pieces);</td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> <span class='keyword'>if</span> (!location->coordinates)</td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> location->coordinates = <span class='macro'>g_strdup (<span class='string_literal'>"---"</span>)<span class='macro_popup'>g_strdup_inline ("---")</span></span>;</td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> location->latitude = <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> location->longitude = <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="179"><td class="num" id="LN179">179</td><td class="line"> location->latlon_valid = (location->latitude < <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span> && location->longitude < <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>);</td></tr> +<tr class="codeline" data-linenumber="180"><td class="num" id="LN180">180</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="181"><td class="num" id="LN181">181</td><td class="line"> location->country_code = <span class='macro'>g_strdup (country_code)<span class='macro_popup'>g_strdup_inline (country_code)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="182"><td class="num" id="LN182">182</td><td class="line"> location->tz_hint = <span class='macro'>g_strdup (tz_hint)<span class='macro_popup'>g_strdup_inline (tz_hint)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="183"><td class="num" id="LN183">183</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="184"><td class="num" id="LN184">184</td><td class="line"> <span class='keyword'>return</span> location;</td></tr> +<tr class="codeline" data-linenumber="185"><td class="num" id="LN185">185</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="186"><td class="num" id="LN186">186</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="187"><td class="num" id="LN187">187</td><td class="line">WeatherLocation *</td></tr> +<tr class="codeline" data-linenumber="188"><td class="num" id="LN188">188</td><td class="line">weather_location_clone (<span class='keyword'>const</span> WeatherLocation *location)</td></tr> +<tr class="codeline" data-linenumber="189"><td class="num" id="LN189">189</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="190"><td class="num" id="LN190">190</td><td class="line"> WeatherLocation *clone;</td></tr> +<tr class="codeline" data-linenumber="191"><td class="num" id="LN191">191</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="192"><td class="num" id="LN192">192</td><td class="line"> <span class='macro'>g_return_val_if_fail (location != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_80<br>; if (location != ((void*)0)) _g_boolean_var_80 = 1; else _g_boolean_var_80<br> = 0; _g_boolean_var_80; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "location != NULL"<br>); return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="193"><td class="num" id="LN193">193</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="194"><td class="num" id="LN194">194</td><td class="line"> clone = weather_location_new (location->name,</td></tr> +<tr class="codeline" data-linenumber="195"><td class="num" id="LN195">195</td><td class="line"> location->code, location->zone,</td></tr> +<tr class="codeline" data-linenumber="196"><td class="num" id="LN196">196</td><td class="line"> location->radar, location->coordinates,</td></tr> +<tr class="codeline" data-linenumber="197"><td class="num" id="LN197">197</td><td class="line"> location->country_code, location->tz_hint);</td></tr> +<tr class="codeline" data-linenumber="198"><td class="num" id="LN198">198</td><td class="line"> clone->latitude = location->latitude;</td></tr> +<tr class="codeline" data-linenumber="199"><td class="num" id="LN199">199</td><td class="line"> clone->longitude = location->longitude;</td></tr> +<tr class="codeline" data-linenumber="200"><td class="num" id="LN200">200</td><td class="line"> clone->latlon_valid = location->latlon_valid;</td></tr> +<tr class="codeline" data-linenumber="201"><td class="num" id="LN201">201</td><td class="line"> <span class='keyword'>return</span> clone;</td></tr> +<tr class="codeline" data-linenumber="202"><td class="num" id="LN202">202</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="203"><td class="num" id="LN203">203</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="204"><td class="num" id="LN204">204</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="205"><td class="num" id="LN205">205</td><td class="line">weather_location_free (WeatherLocation *location)</td></tr> +<tr class="codeline" data-linenumber="206"><td class="num" id="LN206">206</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="207"><td class="num" id="LN207">207</td><td class="line"> <span class='keyword'>if</span> (location) {</td></tr> +<tr class="codeline" data-linenumber="208"><td class="num" id="LN208">208</td><td class="line"> g_free (location->name);</td></tr> +<tr class="codeline" data-linenumber="209"><td class="num" id="LN209">209</td><td class="line"> g_free (location->code);</td></tr> +<tr class="codeline" data-linenumber="210"><td class="num" id="LN210">210</td><td class="line"> g_free (location->zone);</td></tr> +<tr class="codeline" data-linenumber="211"><td class="num" id="LN211">211</td><td class="line"> g_free (location->radar);</td></tr> +<tr class="codeline" data-linenumber="212"><td class="num" id="LN212">212</td><td class="line"> g_free (location->coordinates);</td></tr> +<tr class="codeline" data-linenumber="213"><td class="num" id="LN213">213</td><td class="line"> g_free (location->country_code);</td></tr> +<tr class="codeline" data-linenumber="214"><td class="num" id="LN214">214</td><td class="line"> g_free (location->tz_hint);</td></tr> +<tr class="codeline" data-linenumber="215"><td class="num" id="LN215">215</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="216"><td class="num" id="LN216">216</td><td class="line"> g_free (location);</td></tr> +<tr class="codeline" data-linenumber="217"><td class="num" id="LN217">217</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="218"><td class="num" id="LN218">218</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="219"><td class="num" id="LN219">219</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="220"><td class="num" id="LN220">220</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="221"><td class="num" id="LN221">221</td><td class="line">weather_location_equal (<span class='keyword'>const</span> WeatherLocation *location1, <span class='keyword'>const</span> WeatherLocation *location2)</td></tr> +<tr class="codeline" data-linenumber="222"><td class="num" id="LN222">222</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="223"><td class="num" id="LN223">223</td><td class="line"> <span class='comment'>/* if something is NULL, then it's TRUE if and only if both are NULL) */</span></td></tr> +<tr class="codeline" data-linenumber="224"><td class="num" id="LN224">224</td><td class="line"> <span class='keyword'>if</span> (location1 == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span> || location2 == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="225"><td class="num" id="LN225">225</td><td class="line"> <span class='keyword'>return</span> (location1 == location2);</td></tr> +<tr class="codeline" data-linenumber="226"><td class="num" id="LN226">226</td><td class="line"> <span class='keyword'>if</span> (!location1->code || !location2->code)</td></tr> +<tr class="codeline" data-linenumber="227"><td class="num" id="LN227">227</td><td class="line"> <span class='keyword'>return</span> (location1->code == location2->code);</td></tr> +<tr class="codeline" data-linenumber="228"><td class="num" id="LN228">228</td><td class="line"> <span class='keyword'>if</span> (!location1->name || !location2->name)</td></tr> +<tr class="codeline" data-linenumber="229"><td class="num" id="LN229">229</td><td class="line"> <span class='keyword'>return</span> (location1->name == location2->name);</td></tr> +<tr class="codeline" data-linenumber="230"><td class="num" id="LN230">230</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="231"><td class="num" id="LN231">231</td><td class="line"> <span class='keyword'>return</span> ((strcmp (location1->code, location2->code) == 0) &&</td></tr> +<tr class="codeline" data-linenumber="232"><td class="num" id="LN232">232</td><td class="line"> (strcmp (location1->name, location2->name) == 0));</td></tr> +<tr class="codeline" data-linenumber="233"><td class="num" id="LN233">233</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="234"><td class="num" id="LN234">234</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="235"><td class="num" id="LN235">235</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *wind_direction_str[] = {</td></tr> +<tr class="codeline" data-linenumber="236"><td class="num" id="LN236">236</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Variable"</span>)<span class='macro_popup'>("Variable")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="237"><td class="num" id="LN237">237</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"North"</span>)<span class='macro_popup'>("North")</span></span>, <span class='macro'>N_(<span class='string_literal'>"North - NorthEast"</span>)<span class='macro_popup'>("North - NorthEast")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Northeast"</span>)<span class='macro_popup'>("Northeast")</span></span>, <span class='macro'>N_(<span class='string_literal'>"East - NorthEast"</span>)<span class='macro_popup'>("East - NorthEast")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="238"><td class="num" id="LN238">238</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"East"</span>)<span class='macro_popup'>("East")</span></span>, <span class='macro'>N_(<span class='string_literal'>"East - Southeast"</span>)<span class='macro_popup'>("East - Southeast")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Southeast"</span>)<span class='macro_popup'>("Southeast")</span></span>, <span class='macro'>N_(<span class='string_literal'>"South - Southeast"</span>)<span class='macro_popup'>("South - Southeast")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="239"><td class="num" id="LN239">239</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"South"</span>)<span class='macro_popup'>("South")</span></span>, <span class='macro'>N_(<span class='string_literal'>"South - Southwest"</span>)<span class='macro_popup'>("South - Southwest")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Southwest"</span>)<span class='macro_popup'>("Southwest")</span></span>, <span class='macro'>N_(<span class='string_literal'>"West - Southwest"</span>)<span class='macro_popup'>("West - Southwest")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="240"><td class="num" id="LN240">240</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"West"</span>)<span class='macro_popup'>("West")</span></span>, <span class='macro'>N_(<span class='string_literal'>"West - Northwest"</span>)<span class='macro_popup'>("West - Northwest")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Northwest"</span>)<span class='macro_popup'>("Northwest")</span></span>, <span class='macro'>N_(<span class='string_literal'>"North - Northwest"</span>)<span class='macro_popup'>("North - Northwest")</span></span></td></tr> +<tr class="codeline" data-linenumber="241"><td class="num" id="LN241">241</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="242"><td class="num" id="LN242">242</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="243"><td class="num" id="LN243">243</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="244"><td class="num" id="LN244">244</td><td class="line">weather_wind_direction_string (WeatherWindDirection wind)</td></tr> +<tr class="codeline" data-linenumber="245"><td class="num" id="LN245">245</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="246"><td class="num" id="LN246">246</td><td class="line"> <span class='keyword'>if</span> (wind <= WIND_INVALID || wind >= WIND_LAST)</td></tr> +<tr class="codeline" data-linenumber="247"><td class="num" id="LN247">247</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Invalid"</span>)<span class='macro_popup'>(mateweather_gettext ("Invalid"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="248"><td class="num" id="LN248">248</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="249"><td class="num" id="LN249">249</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(wind_direction_str[(<span class='keyword'>int</span>)wind])<span class='macro_popup'>(mateweather_gettext (wind_direction_str[(int)wind]))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="250"><td class="num" id="LN250">250</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="251"><td class="num" id="LN251">251</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="252"><td class="num" id="LN252">252</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *sky_str[] = {</td></tr> +<tr class="codeline" data-linenumber="253"><td class="num" id="LN253">253</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Clear Sky"</span>)<span class='macro_popup'>("Clear Sky")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="254"><td class="num" id="LN254">254</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Broken clouds"</span>)<span class='macro_popup'>("Broken clouds")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="255"><td class="num" id="LN255">255</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Scattered clouds"</span>)<span class='macro_popup'>("Scattered clouds")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="256"><td class="num" id="LN256">256</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Few clouds"</span>)<span class='macro_popup'>("Few clouds")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="257"><td class="num" id="LN257">257</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Overcast"</span>)<span class='macro_popup'>("Overcast")</span></span></td></tr> +<tr class="codeline" data-linenumber="258"><td class="num" id="LN258">258</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="259"><td class="num" id="LN259">259</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="260"><td class="num" id="LN260">260</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="261"><td class="num" id="LN261">261</td><td class="line">weather_sky_string (WeatherSky sky)</td></tr> +<tr class="codeline" data-linenumber="262"><td class="num" id="LN262">262</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="263"><td class="num" id="LN263">263</td><td class="line"> <span class='keyword'>if</span> (sky <= SKY_INVALID || sky >= SKY_LAST)</td></tr> +<tr class="codeline" data-linenumber="264"><td class="num" id="LN264">264</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Invalid"</span>)<span class='macro_popup'>(mateweather_gettext ("Invalid"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="265"><td class="num" id="LN265">265</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="266"><td class="num" id="LN266">266</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(sky_str[(<span class='keyword'>int</span>)sky])<span class='macro_popup'>(mateweather_gettext (sky_str[(int)sky]))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="267"><td class="num" id="LN267">267</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="268"><td class="num" id="LN268">268</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="269"><td class="num" id="LN269">269</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="270"><td class="num" id="LN270">270</td><td class="line"> <span class='comment'>* Even though tedious, I switched to a 2D array for weather condition</span></td></tr> +<tr class="codeline" data-linenumber="271"><td class="num" id="LN271">271</td><td class="line"> <span class='comment'>* strings, in order to facilitate internationalization, esp. for languages</span></td></tr> +<tr class="codeline" data-linenumber="272"><td class="num" id="LN272">272</td><td class="line"> <span class='comment'>* with genders.</span></td></tr> +<tr class="codeline" data-linenumber="273"><td class="num" id="LN273">273</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="274"><td class="num" id="LN274">274</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="275"><td class="num" id="LN275">275</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="276"><td class="num" id="LN276">276</td><td class="line"> <span class='comment'>* Almost all reportable combinations listed in</span></td></tr> +<tr class="codeline" data-linenumber="277"><td class="num" id="LN277">277</td><td class="line"> <span class='comment'>* http://www.crh.noaa.gov/arx/wx.tbl.php are entered below, except those</span></td></tr> +<tr class="codeline" data-linenumber="278"><td class="num" id="LN278">278</td><td class="line"> <span class='comment'>* having 2 qualifiers mixed together [such as "Blowing snow in vicinity"</span></td></tr> +<tr class="codeline" data-linenumber="279"><td class="num" id="LN279">279</td><td class="line"> <span class='comment'>* (VCBLSN), "Thunderstorm in vicinity" (VCTS), etc].</span></td></tr> +<tr class="codeline" data-linenumber="280"><td class="num" id="LN280">280</td><td class="line"> <span class='comment'>* Combinations that are not possible are filled in with "??".</span></td></tr> +<tr class="codeline" data-linenumber="281"><td class="num" id="LN281">281</td><td class="line"> <span class='comment'>* Some other exceptions not handled yet, such as "SN BLSN" which has</span></td></tr> +<tr class="codeline" data-linenumber="282"><td class="num" id="LN282">282</td><td class="line"> <span class='comment'>* special meaning.</span></td></tr> +<tr class="codeline" data-linenumber="283"><td class="num" id="LN283">283</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="284"><td class="num" id="LN284">284</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="285"><td class="num" id="LN285">285</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="286"><td class="num" id="LN286">286</td><td class="line"> <span class='comment'>* Note, magic numbers, when you change the size here, make sure to change</span></td></tr> +<tr class="codeline" data-linenumber="287"><td class="num" id="LN287">287</td><td class="line"> <span class='comment'>* the below function so that new values are recognized</span></td></tr> +<tr class="codeline" data-linenumber="288"><td class="num" id="LN288">288</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="289"><td class="num" id="LN289">289</td><td class="line"><span class='comment'>/* NONE VICINITY LIGHT MODERATE HEAVY SHALLOW PATCHES PARTIAL THUNDERSTORM BLOWING SHOWERS DRIFTING FREEZING */</span></td></tr> +<tr class="codeline" data-linenumber="290"><td class="num" id="LN290">290</td><td class="line"><span class='comment'>/* *******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/</span></td></tr> +<tr class="codeline" data-linenumber="291"><td class="num" id="LN291">291</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *conditions_str[24][13] = {</td></tr> +<tr class="codeline" data-linenumber="292"><td class="num" id="LN292">292</td><td class="line"><span class='comment'>/* Translators: If you want to know what "blowing" "shallow" "partial"</span></td></tr> +<tr class="codeline" data-linenumber="293"><td class="num" id="LN293">293</td><td class="line"> <span class='comment'>* etc means, you can go to http://www.weather.com/glossary/ and</span></td></tr> +<tr class="codeline" data-linenumber="294"><td class="num" id="LN294">294</td><td class="line"> <span class='comment'>* http://www.crh.noaa.gov/arx/wx.tbl.php */</span></td></tr> +<tr class="codeline" data-linenumber="295"><td class="num" id="LN295">295</td><td class="line"> <span class='comment'>/* NONE */</span> {<span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Thunderstorm"</span>)<span class='macro_popup'>("Thunderstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="296"><td class="num" id="LN296">296</td><td class="line"> <span class='comment'>/* DRIZZLE */</span> {<span class='macro'>N_(<span class='string_literal'>"Drizzle"</span>)<span class='macro_popup'>("Drizzle")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Light drizzle"</span>)<span class='macro_popup'>("Light drizzle")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate drizzle"</span>)<span class='macro_popup'>("Moderate drizzle")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy drizzle"</span>)<span class='macro_popup'>("Heavy drizzle")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Freezing drizzle"</span>)<span class='macro_popup'>("Freezing drizzle")</span></span> },</td></tr> +<tr class="codeline" data-linenumber="297"><td class="num" id="LN297">297</td><td class="line"> <span class='comment'>/* RAIN */</span> {<span class='macro'>N_(<span class='string_literal'>"Rain"</span>)<span class='macro_popup'>("Rain")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Light rain"</span>)<span class='macro_popup'>("Light rain")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate rain"</span>)<span class='macro_popup'>("Moderate rain")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy rain"</span>)<span class='macro_popup'>("Heavy rain")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Thunderstorm"</span>)<span class='macro_popup'>("Thunderstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Rain showers"</span>)<span class='macro_popup'>("Rain showers")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Freezing rain"</span>)<span class='macro_popup'>("Freezing rain")</span></span> },</td></tr> +<tr class="codeline" data-linenumber="298"><td class="num" id="LN298">298</td><td class="line"> <span class='comment'>/* SNOW */</span> {<span class='macro'>N_(<span class='string_literal'>"Snow"</span>)<span class='macro_popup'>("Snow")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Light snow"</span>)<span class='macro_popup'>("Light snow")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate snow"</span>)<span class='macro_popup'>("Moderate snow")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy snow"</span>)<span class='macro_popup'>("Heavy snow")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Snowstorm"</span>)<span class='macro_popup'>("Snowstorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Blowing snowfall"</span>)<span class='macro_popup'>("Blowing snowfall")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Snow showers"</span>)<span class='macro_popup'>("Snow showers")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Drifting snow"</span>)<span class='macro_popup'>("Drifting snow")</span></span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="299"><td class="num" id="LN299">299</td><td class="line"> <span class='comment'>/* SNOW_GRAINS */</span> {<span class='macro'>N_(<span class='string_literal'>"Snow grains"</span>)<span class='macro_popup'>("Snow grains")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Light snow grains"</span>)<span class='macro_popup'>("Light snow grains")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate snow grains"</span>)<span class='macro_popup'>("Moderate snow grains")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy snow grains"</span>)<span class='macro_popup'>("Heavy snow grains")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="300"><td class="num" id="LN300">300</td><td class="line"> <span class='comment'>/* ICE_CRYSTALS */</span> {<span class='macro'>N_(<span class='string_literal'>"Ice crystals"</span>)<span class='macro_popup'>("Ice crystals")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Ice crystals"</span>)<span class='macro_popup'>("Ice crystals")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="301"><td class="num" id="LN301">301</td><td class="line"> <span class='comment'>/* ICE_PELLETS */</span> {<span class='macro'>N_(<span class='string_literal'>"Ice pellets"</span>)<span class='macro_popup'>("Ice pellets")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Few ice pellets"</span>)<span class='macro_popup'>("Few ice pellets")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate ice pellets"</span>)<span class='macro_popup'>("Moderate ice pellets")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy ice pellets"</span>)<span class='macro_popup'>("Heavy ice pellets")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Ice pellet storm"</span>)<span class='macro_popup'>("Ice pellet storm")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Showers of ice pellets"</span>)<span class='macro_popup'>("Showers of ice pellets")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="302"><td class="num" id="LN302">302</td><td class="line"> <span class='comment'>/* HAIL */</span> {<span class='macro'>N_(<span class='string_literal'>"Hail"</span>)<span class='macro_popup'>("Hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Hail"</span>)<span class='macro_popup'>("Hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Hailstorm"</span>)<span class='macro_popup'>("Hailstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Hail showers"</span>)<span class='macro_popup'>("Hail showers")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, },</td></tr> +<tr class="codeline" data-linenumber="303"><td class="num" id="LN303">303</td><td class="line"> <span class='comment'>/* SMALL_HAIL */</span> {<span class='macro'>N_(<span class='string_literal'>"Small hail"</span>)<span class='macro_popup'>("Small hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Small hail"</span>)<span class='macro_popup'>("Small hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Small hailstorm"</span>)<span class='macro_popup'>("Small hailstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Showers of small hail"</span>)<span class='macro_popup'>("Showers of small hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="304"><td class="num" id="LN304">304</td><td class="line"> <span class='comment'>/* PRECIPITATION */</span> {<span class='macro'>N_(<span class='string_literal'>"Unknown precipitation"</span>)<span class='macro_popup'>("Unknown precipitation")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="305"><td class="num" id="LN305">305</td><td class="line"> <span class='comment'>/* MIST */</span> {<span class='macro'>N_(<span class='string_literal'>"Mist"</span>)<span class='macro_popup'>("Mist")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Mist"</span>)<span class='macro_popup'>("Mist")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="306"><td class="num" id="LN306">306</td><td class="line"> <span class='comment'>/* FOG */</span> {<span class='macro'>N_(<span class='string_literal'>"Fog"</span>)<span class='macro_popup'>("Fog")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Fog in the vicinity"</span>)<span class='macro_popup'>("Fog in the vicinity")</span></span> , <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Fog"</span>)<span class='macro_popup'>("Fog")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Shallow fog"</span>)<span class='macro_popup'>("Shallow fog")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Patches of fog"</span>)<span class='macro_popup'>("Patches of fog")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Partial fog"</span>)<span class='macro_popup'>("Partial fog")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Freezing fog"</span>)<span class='macro_popup'>("Freezing fog")</span></span> },</td></tr> +<tr class="codeline" data-linenumber="307"><td class="num" id="LN307">307</td><td class="line"> <span class='comment'>/* SMOKE */</span> {<span class='macro'>N_(<span class='string_literal'>"Smoke"</span>)<span class='macro_popup'>("Smoke")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Smoke"</span>)<span class='macro_popup'>("Smoke")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="308"><td class="num" id="LN308">308</td><td class="line"> <span class='comment'>/* VOLCANIC_ASH */</span> {<span class='macro'>N_(<span class='string_literal'>"Volcanic ash"</span>)<span class='macro_popup'>("Volcanic ash")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Volcanic ash"</span>)<span class='macro_popup'>("Volcanic ash")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="309"><td class="num" id="LN309">309</td><td class="line"> <span class='comment'>/* SAND */</span> {<span class='macro'>N_(<span class='string_literal'>"Sand"</span>)<span class='macro_popup'>("Sand")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Sand"</span>)<span class='macro_popup'>("Sand")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Blowing sand"</span>)<span class='macro_popup'>("Blowing sand")</span></span>, <span class='string_literal'>""</span>, <span class='macro'>N_(<span class='string_literal'>"Drifting sand"</span>)<span class='macro_popup'>("Drifting sand")</span></span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="310"><td class="num" id="LN310">310</td><td class="line"> <span class='comment'>/* HAZE */</span> {<span class='macro'>N_(<span class='string_literal'>"Haze"</span>)<span class='macro_popup'>("Haze")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Haze"</span>)<span class='macro_popup'>("Haze")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="311"><td class="num" id="LN311">311</td><td class="line"> <span class='comment'>/* SPRAY */</span> {<span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Blowing sprays"</span>)<span class='macro_popup'>("Blowing sprays")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="312"><td class="num" id="LN312">312</td><td class="line"> <span class='comment'>/* DUST */</span> {<span class='macro'>N_(<span class='string_literal'>"Dust"</span>)<span class='macro_popup'>("Dust")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Dust"</span>)<span class='macro_popup'>("Dust")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Blowing dust"</span>)<span class='macro_popup'>("Blowing dust")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Drifting dust"</span>)<span class='macro_popup'>("Drifting dust")</span></span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="313"><td class="num" id="LN313">313</td><td class="line"> <span class='comment'>/* SQUALL */</span> {<span class='macro'>N_(<span class='string_literal'>"Squall"</span>)<span class='macro_popup'>("Squall")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Squall"</span>)<span class='macro_popup'>("Squall")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="314"><td class="num" id="LN314">314</td><td class="line"> <span class='comment'>/* SANDSTORM */</span> {<span class='macro'>N_(<span class='string_literal'>"Sandstorm"</span>)<span class='macro_popup'>("Sandstorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Sandstorm in the vicinity"</span>)<span class='macro_popup'>("Sandstorm in the vicinity")</span></span> , <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Sandstorm"</span>)<span class='macro_popup'>("Sandstorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy sandstorm"</span>)<span class='macro_popup'>("Heavy sandstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="315"><td class="num" id="LN315">315</td><td class="line"> <span class='comment'>/* DUSTSTORM */</span> {<span class='macro'>N_(<span class='string_literal'>"Duststorm"</span>)<span class='macro_popup'>("Duststorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Duststorm in the vicinity"</span>)<span class='macro_popup'>("Duststorm in the vicinity")</span></span> , <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Duststorm"</span>)<span class='macro_popup'>("Duststorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy duststorm"</span>)<span class='macro_popup'>("Heavy duststorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="316"><td class="num" id="LN316">316</td><td class="line"> <span class='comment'>/* FUNNEL_CLOUD */</span> {<span class='macro'>N_(<span class='string_literal'>"Funnel cloud"</span>)<span class='macro_popup'>("Funnel cloud")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="317"><td class="num" id="LN317">317</td><td class="line"> <span class='comment'>/* TORNADO */</span> {<span class='macro'>N_(<span class='string_literal'>"Tornado"</span>)<span class='macro_popup'>("Tornado")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="318"><td class="num" id="LN318">318</td><td class="line"> <span class='comment'>/* DUST_WHIRLS */</span> {<span class='macro'>N_(<span class='string_literal'>"Dust whirls"</span>)<span class='macro_popup'>("Dust whirls")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Dust whirls in the vicinity"</span>)<span class='macro_popup'>("Dust whirls in the vicinity")</span></span> , <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Dust whirls"</span>)<span class='macro_popup'>("Dust whirls")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> }</td></tr> +<tr class="codeline" data-linenumber="319"><td class="num" id="LN319">319</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="320"><td class="num" id="LN320">320</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="321"><td class="num" id="LN321">321</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="322"><td class="num" id="LN322">322</td><td class="line">weather_conditions_string (WeatherConditions cond)</td></tr> +<tr class="codeline" data-linenumber="323"><td class="num" id="LN323">323</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="324"><td class="num" id="LN324">324</td><td class="line"> <span class='keyword'>const</span> gchar *str;</td></tr> +<tr class="codeline" data-linenumber="325"><td class="num" id="LN325">325</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="326"><td class="num" id="LN326">326</td><td class="line"> <span class='keyword'>if</span> (!cond.significant) {</td></tr> +<tr class="codeline" data-linenumber="327"><td class="num" id="LN327">327</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="328"><td class="num" id="LN328">328</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="329"><td class="num" id="LN329">329</td><td class="line"> <span class='keyword'>if</span> (cond.phenomenon > PHENOMENON_INVALID &&</td></tr> +<tr class="codeline" data-linenumber="330"><td class="num" id="LN330">330</td><td class="line"> cond.phenomenon < PHENOMENON_LAST &&</td></tr> +<tr class="codeline" data-linenumber="331"><td class="num" id="LN331">331</td><td class="line"> cond.qualifier > QUALIFIER_INVALID &&</td></tr> +<tr class="codeline" data-linenumber="332"><td class="num" id="LN332">332</td><td class="line"> cond.qualifier < QUALIFIER_LAST)</td></tr> +<tr class="codeline" data-linenumber="333"><td class="num" id="LN333">333</td><td class="line"> str = <span class='macro'>_(conditions_str[(<span class='keyword'>int</span>)cond.phenomenon][(<span class='keyword'>int</span>)cond.qualifier])<span class='macro_popup'>(mateweather_gettext (conditions_str[(int)cond.phenomenon][(int<br>)cond.qualifier]))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="334"><td class="num" id="LN334">334</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="335"><td class="num" id="LN335">335</td><td class="line"> str = <span class='macro'>_(<span class='string_literal'>"Invalid"</span>)<span class='macro_popup'>(mateweather_gettext ("Invalid"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="336"><td class="num" id="LN336">336</td><td class="line"> <span class='keyword'>return</span> (strlen (str) > 0) ? str : <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="337"><td class="num" id="LN337">337</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="338"><td class="num" id="LN338">338</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="339"><td class="num" id="LN339">339</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="340"><td class="num" id="LN340">340</td><td class="line"><span class='comment'>/* Locals turned global to facilitate asynchronous HTTP requests */</span></td></tr> +<tr class="codeline" data-linenumber="341"><td class="num" id="LN341">341</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="342"><td class="num" id="LN342">342</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="343"><td class="num" id="LN343">343</td><td class="line">requests_init (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="344"><td class="num" id="LN344">344</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="345"><td class="num" id="LN345">345</td><td class="line"> <span class='keyword'>if</span> (info->requests_pending)</td></tr> +<tr class="codeline" data-linenumber="346"><td class="num" id="LN346">346</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="347"><td class="num" id="LN347">347</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="348"><td class="num" id="LN348">348</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="349"><td class="num" id="LN349">349</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="350"><td class="num" id="LN350">350</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="351"><td class="num" id="LN351">351</td><td class="line"><span class='keyword'>void</span> request_done (WeatherInfo *info, gboolean ok)</td></tr> +<tr class="codeline" data-linenumber="352"><td class="num" id="LN352">352</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="353"><td class="num" id="LN353">353</td><td class="line"> <span class='keyword'>if</span> (ok) {</td></tr> +<tr class="codeline" data-linenumber="354"><td class="num" id="LN354">354</td><td class="line"> (<span class='keyword'>void</span>) calc_sun (info);</td></tr> +<tr class="codeline" data-linenumber="355"><td class="num" id="LN355">355</td><td class="line"> info->moonValid = info->valid && calc_moon (info);</td></tr> +<tr class="codeline" data-linenumber="356"><td class="num" id="LN356">356</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="357"><td class="num" id="LN357">357</td><td class="line"> <span class='keyword'>if</span> (!--info->requests_pending)</td></tr> +<tr class="codeline" data-linenumber="358"><td class="num" id="LN358">358</td><td class="line"> info->finish_cb (info, info->cb_data);</td></tr> +<tr class="codeline" data-linenumber="359"><td class="num" id="LN359">359</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="360"><td class="num" id="LN360">360</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="361"><td class="num" id="LN361">361</td><td class="line"><span class='comment'>/* it's OK to pass in NULL */</span></td></tr> +<tr class="codeline" data-linenumber="362"><td class="num" id="LN362">362</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="363"><td class="num" id="LN363">363</td><td class="line">free_forecast_list (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="364"><td class="num" id="LN364">364</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="365"><td class="num" id="LN365">365</td><td class="line"> GSList *p;</td></tr> +<tr class="codeline" data-linenumber="366"><td class="num" id="LN366">366</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="367"><td class="num" id="LN367">367</td><td class="line"> <span class='keyword'>if</span> (!info)</td></tr> +<tr class="codeline" data-linenumber="368"><td class="num" id="LN368">368</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="369"><td class="num" id="LN369">369</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="370"><td class="num" id="LN370">370</td><td class="line"> <span class='keyword'>for</span> (p = info->forecast_list; p; p = p->next)</td></tr> +<tr class="codeline" data-linenumber="371"><td class="num" id="LN371">371</td><td class="line"> weather_info_free (p->data);</td></tr> +<tr class="codeline" data-linenumber="372"><td class="num" id="LN372">372</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="373"><td class="num" id="LN373">373</td><td class="line"> <span class='keyword'>if</span> (info->forecast_list) {</td></tr> +<tr class="codeline" data-linenumber="374"><td class="num" id="LN374">374</td><td class="line"> g_slist_free (info->forecast_list);</td></tr> +<tr class="codeline" data-linenumber="375"><td class="num" id="LN375">375</td><td class="line"> info->forecast_list = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="376"><td class="num" id="LN376">376</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="377"><td class="num" id="LN377">377</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="378"><td class="num" id="LN378">378</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="379"><td class="num" id="LN379">379</td><td class="line"><span class='comment'>/* Relative humidity computation - thanks to <[email protected]> */</span></td></tr> +<tr class="codeline" data-linenumber="380"><td class="num" id="LN380">380</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="381"><td class="num" id="LN381">381</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>inline</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="382"><td class="num" id="LN382">382</td><td class="line">calc_humidity (gdouble temp, gdouble dewp)</td></tr> +<tr class="codeline" data-linenumber="383"><td class="num" id="LN383">383</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="384"><td class="num" id="LN384">384</td><td class="line"> gdouble esat, esurf;</td></tr> +<tr class="codeline" data-linenumber="385"><td class="num" id="LN385">385</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="386"><td class="num" id="LN386">386</td><td class="line"> <span class='keyword'>if</span> (temp > -500.0 && dewp > -500.0) {</td></tr> +<tr class="codeline" data-linenumber="387"><td class="num" id="LN387">387</td><td class="line"> temp = <span class='macro'>TEMP_F_TO_C (temp)<span class='macro_popup'>(((temp) - 32.0) * (5.0/9.0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="388"><td class="num" id="LN388">388</td><td class="line"> dewp = <span class='macro'>TEMP_F_TO_C (dewp)<span class='macro_popup'>(((dewp) - 32.0) * (5.0/9.0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="389"><td class="num" id="LN389">389</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="390"><td class="num" id="LN390">390</td><td class="line"> esat = 6.11 * pow (10.0, (7.5 * temp) / (237.7 + temp));</td></tr> +<tr class="codeline" data-linenumber="391"><td class="num" id="LN391">391</td><td class="line"> esurf = 6.11 * pow (10.0, (7.5 * dewp) / (237.7 + dewp));</td></tr> +<tr class="codeline" data-linenumber="392"><td class="num" id="LN392">392</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="393"><td class="num" id="LN393">393</td><td class="line"> esurf = -1.0;</td></tr> +<tr class="codeline" data-linenumber="394"><td class="num" id="LN394">394</td><td class="line"> esat = 1.0;</td></tr> +<tr class="codeline" data-linenumber="395"><td class="num" id="LN395">395</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="396"><td class="num" id="LN396">396</td><td class="line"> <span class='keyword'>return</span> ((esurf/esat) * 100.0);</td></tr> +<tr class="codeline" data-linenumber="397"><td class="num" id="LN397">397</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="398"><td class="num" id="LN398">398</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="399"><td class="num" id="LN399">399</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>inline</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="400"><td class="num" id="LN400">400</td><td class="line">calc_apparent (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="401"><td class="num" id="LN401">401</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="402"><td class="num" id="LN402">402</td><td class="line"> gdouble temp = info->temp;</td></tr> +<tr class="codeline" data-linenumber="403"><td class="num" id="LN403">403</td><td class="line"> gdouble wind = <span class='macro'>WINDSPEED_KNOTS_TO_MPH (info->windspeed)<span class='macro_popup'>((info->windspeed) * 1.150779)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="404"><td class="num" id="LN404">404</td><td class="line"> gdouble apparent = -1000.;</td></tr> +<tr class="codeline" data-linenumber="405"><td class="num" id="LN405">405</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="406"><td class="num" id="LN406">406</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="407"><td class="num" id="LN407">407</td><td class="line"> <span class='comment'>* Wind chill calculations as of 01-Nov-2001</span></td></tr> +<tr class="codeline" data-linenumber="408"><td class="num" id="LN408">408</td><td class="line"> <span class='comment'>* http://www.nws.noaa.gov/om/windchill/index.shtml</span></td></tr> +<tr class="codeline" data-linenumber="409"><td class="num" id="LN409">409</td><td class="line"> <span class='comment'>* Some pages suggest that the formula will soon be adjusted</span></td></tr> +<tr class="codeline" data-linenumber="410"><td class="num" id="LN410">410</td><td class="line"> <span class='comment'>* to account for solar radiation (bright sun vs cloudy sky)</span></td></tr> +<tr class="codeline" data-linenumber="411"><td class="num" id="LN411">411</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="412"><td class="num" id="LN412">412</td><td class="line"> <span class='keyword'>if</span> (temp <= 50.0) {</td></tr> +<tr class="codeline" data-linenumber="413"><td class="num" id="LN413">413</td><td class="line"> <span class='keyword'>if</span> (wind > 3.0) {</td></tr> +<tr class="codeline" data-linenumber="414"><td class="num" id="LN414">414</td><td class="line"> gdouble v = pow (wind, 0.16);</td></tr> +<tr class="codeline" data-linenumber="415"><td class="num" id="LN415">415</td><td class="line"> apparent = 35.74 + 0.6215 * temp - 35.75 * v + 0.4275 * temp * v;</td></tr> +<tr class="codeline" data-linenumber="416"><td class="num" id="LN416">416</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (wind >= 0.) {</td></tr> +<tr class="codeline" data-linenumber="417"><td class="num" id="LN417">417</td><td class="line"> apparent = temp;</td></tr> +<tr class="codeline" data-linenumber="418"><td class="num" id="LN418">418</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="419"><td class="num" id="LN419">419</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="420"><td class="num" id="LN420">420</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="421"><td class="num" id="LN421">421</td><td class="line"> <span class='comment'>* Heat index calculations:</span></td></tr> +<tr class="codeline" data-linenumber="422"><td class="num" id="LN422">422</td><td class="line"> <span class='comment'>* http://www.srh.noaa.gov/fwd/heatindex/heat5.html</span></td></tr> +<tr class="codeline" data-linenumber="423"><td class="num" id="LN423">423</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="424"><td class="num" id="LN424">424</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (temp >= 80.0) {</td></tr> +<tr class="codeline" data-linenumber="425"><td class="num" id="LN425">425</td><td class="line"> <span class='keyword'>if</span> (info->temp >= -500. && info->dew >= -500.) {</td></tr> +<tr class="codeline" data-linenumber="426"><td class="num" id="LN426">426</td><td class="line"> gdouble humidity = calc_humidity (info->temp, info->dew);</td></tr> +<tr class="codeline" data-linenumber="427"><td class="num" id="LN427">427</td><td class="line"> gdouble t2 = temp * temp;</td></tr> +<tr class="codeline" data-linenumber="428"><td class="num" id="LN428">428</td><td class="line"> gdouble h2 = humidity * humidity;</td></tr> +<tr class="codeline" data-linenumber="429"><td class="num" id="LN429">429</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="430"><td class="num" id="LN430">430</td><td class="line"><span class='directive'>#if 1</span></td></tr> +<tr class="codeline" data-linenumber="431"><td class="num" id="LN431">431</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="432"><td class="num" id="LN432">432</td><td class="line"> <span class='comment'>* A really precise formula. Note that overall precision is</span></td></tr> +<tr class="codeline" data-linenumber="433"><td class="num" id="LN433">433</td><td class="line"> <span class='comment'>* constrained by the accuracy of the instruments and that the</span></td></tr> +<tr class="codeline" data-linenumber="434"><td class="num" id="LN434">434</td><td class="line"> <span class='comment'>* we receive the temperature and dewpoints as integers.</span></td></tr> +<tr class="codeline" data-linenumber="435"><td class="num" id="LN435">435</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="436"><td class="num" id="LN436">436</td><td class="line"> gdouble t3 = t2 * temp;</td></tr> +<tr class="codeline" data-linenumber="437"><td class="num" id="LN437">437</td><td class="line"> gdouble h3 = h2 * temp;</td></tr> +<tr class="codeline" data-linenumber="438"><td class="num" id="LN438">438</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="439"><td class="num" id="LN439">439</td><td class="line"> apparent = 16.923</td></tr> +<tr class="codeline" data-linenumber="440"><td class="num" id="LN440">440</td><td class="line"> + 0.185212 * temp</td></tr> +<tr class="codeline" data-linenumber="441"><td class="num" id="LN441">441</td><td class="line"> + 5.37941 * humidity</td></tr> +<tr class="codeline" data-linenumber="442"><td class="num" id="LN442">442</td><td class="line"> - 0.100254 * temp * humidity</td></tr> +<tr class="codeline" data-linenumber="443"><td class="num" id="LN443">443</td><td class="line"> + 9.41695e-3 * t2</td></tr> +<tr class="codeline" data-linenumber="444"><td class="num" id="LN444">444</td><td class="line"> + 7.28898e-3 * h2</td></tr> +<tr class="codeline" data-linenumber="445"><td class="num" id="LN445">445</td><td class="line"> + 3.45372e-4 * t2 * humidity</td></tr> +<tr class="codeline" data-linenumber="446"><td class="num" id="LN446">446</td><td class="line"> - 8.14971e-4 * temp * h2</td></tr> +<tr class="codeline" data-linenumber="447"><td class="num" id="LN447">447</td><td class="line"> + 1.02102e-5 * t2 * h2</td></tr> +<tr class="codeline" data-linenumber="448"><td class="num" id="LN448">448</td><td class="line"> - 3.8646e-5 * t3</td></tr> +<tr class="codeline" data-linenumber="449"><td class="num" id="LN449">449</td><td class="line"> + 2.91583e-5 * h3</td></tr> +<tr class="codeline" data-linenumber="450"><td class="num" id="LN450">450</td><td class="line"> + 1.42721e-6 * t3 * humidity</td></tr> +<tr class="codeline" data-linenumber="451"><td class="num" id="LN451">451</td><td class="line"> + 1.97483e-7 * temp * h3</td></tr> +<tr class="codeline" data-linenumber="452"><td class="num" id="LN452">452</td><td class="line"> - 2.18429e-8 * t3 * h2</td></tr> +<tr class="codeline" data-linenumber="453"><td class="num" id="LN453">453</td><td class="line"> + 8.43296e-10 * t2 * h3</td></tr> +<tr class="codeline" data-linenumber="454"><td class="num" id="LN454">454</td><td class="line"> - 4.81975e-11 * t3 * h3;</td></tr> +<tr class="codeline" data-linenumber="455"><td class="num" id="LN455">455</td><td class="line"><span class='directive'>#else</span></td></tr> +<tr class="codeline" data-linenumber="456"><td class="num" id="LN456">456</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="457"><td class="num" id="LN457">457</td><td class="line"> <span class='comment'>* An often cited alternative: values are within 5 degrees for</span></td></tr> +<tr class="codeline" data-linenumber="458"><td class="num" id="LN458">458</td><td class="line"> <span class='comment'>* most ranges between 10% and 70% humidity and to 110 degrees.</span></td></tr> +<tr class="codeline" data-linenumber="459"><td class="num" id="LN459">459</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="460"><td class="num" id="LN460">460</td><td class="line"> apparent = - 42.379</td></tr> +<tr class="codeline" data-linenumber="461"><td class="num" id="LN461">461</td><td class="line"> + 2.04901523 * temp</td></tr> +<tr class="codeline" data-linenumber="462"><td class="num" id="LN462">462</td><td class="line"> + 10.14333127 * humidity</td></tr> +<tr class="codeline" data-linenumber="463"><td class="num" id="LN463">463</td><td class="line"> - 0.22475541 * temp * humidity</td></tr> +<tr class="codeline" data-linenumber="464"><td class="num" id="LN464">464</td><td class="line"> - 6.83783e-3 * t2</td></tr> +<tr class="codeline" data-linenumber="465"><td class="num" id="LN465">465</td><td class="line"> - 5.481717e-2 * h2</td></tr> +<tr class="codeline" data-linenumber="466"><td class="num" id="LN466">466</td><td class="line"> + 1.22874e-3 * t2 * humidity</td></tr> +<tr class="codeline" data-linenumber="467"><td class="num" id="LN467">467</td><td class="line"> + 8.5282e-4 * temp * h2</td></tr> +<tr class="codeline" data-linenumber="468"><td class="num" id="LN468">468</td><td class="line"> - 1.99e-6 * t2 * h2;</td></tr> +<tr class="codeline" data-linenumber="469"><td class="num" id="LN469">469</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="470"><td class="num" id="LN470">470</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="471"><td class="num" id="LN471">471</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="472"><td class="num" id="LN472">472</td><td class="line"> apparent = temp;</td></tr> +<tr class="codeline" data-linenumber="473"><td class="num" id="LN473">473</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="474"><td class="num" id="LN474">474</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="475"><td class="num" id="LN475">475</td><td class="line"> <span class='keyword'>return</span> apparent;</td></tr> +<tr class="codeline" data-linenumber="476"><td class="num" id="LN476">476</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="477"><td class="num" id="LN477">477</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="478"><td class="num" id="LN478">478</td><td class="line">WeatherInfo *</td></tr> +<tr class="codeline" data-linenumber="479"><td class="num" id="LN479">479</td><td class="line">_weather_info_fill (WeatherInfo *info,</td></tr> +<tr class="codeline" data-linenumber="480"><td class="num" id="LN480">480</td><td class="line"> WeatherLocation *location,</td></tr> +<tr class="codeline" data-linenumber="481"><td class="num" id="LN481">481</td><td class="line"> <span class='keyword'>const</span> WeatherPrefs *prefs,</td></tr> +<tr class="codeline" data-linenumber="482"><td class="num" id="LN482">482</td><td class="line"> WeatherInfoFunc cb,</td></tr> +<tr class="codeline" data-linenumber="483"><td class="num" id="LN483">483</td><td class="line"> gpointer data)</td></tr> +<tr class="codeline" data-linenumber="484"><td class="num" id="LN484">484</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="485"><td class="num" id="LN485">485</td><td class="line"> <span class='macro'>g_return_val_if_fail (((info == NULL) && (location != NULL)) || \<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_81<br>; if (((info == ((void*)0)) && (location != ((void*)0<br>))) || ((info != ((void*)0)) && (location == ((void*)<br>0)))) _g_boolean_var_81 = 1; else _g_boolean_var_81 = 0; _g_boolean_var_81<br>; }), 1))) { } else { g_return_if_fail_warning ("MateWeather"<br>, ((const char*) (__func__)), "((info == NULL) && (location != NULL)) || ((info != NULL) && (location == NULL))"<br>); return (((void*)0)); } } while (0)</span></span></td></tr> +<tr class="codeline" data-linenumber="486"><td class="num" id="LN486">486</td><td class="line"> <span class='macro'>((info != NULL) && (location == NULL)), NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_81<br>; if (((info == ((void*)0)) && (location != ((void*)0<br>))) || ((info != ((void*)0)) && (location == ((void*)<br>0)))) _g_boolean_var_81 = 1; else _g_boolean_var_81 = 0; _g_boolean_var_81<br>; }), 1))) { } else { g_return_if_fail_warning ("MateWeather"<br>, ((const char*) (__func__)), "((info == NULL) && (location != NULL)) || ((info != NULL) && (location == NULL))"<br>); return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="487"><td class="num" id="LN487">487</td><td class="line"> <span class='macro'>g_return_val_if_fail (prefs != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_82<br>; if (prefs != ((void*)0)) _g_boolean_var_82 = 1; else _g_boolean_var_82<br> = 0; _g_boolean_var_82; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "prefs != NULL")<br>; return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="488"><td class="num" id="LN488">488</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="489"><td class="num" id="LN489">489</td><td class="line"> <span class='comment'>/* FIXME: i'm not sure this works as intended anymore */</span></td></tr> +<tr class="codeline" data-linenumber="490"><td class="num" id="LN490">490</td><td class="line"> <span class='keyword'>if</span> (!info) {</td></tr> +<tr class="codeline" data-linenumber="491"><td class="num" id="LN491">491</td><td class="line"> info = <span class='macro'>g_new0 (WeatherInfo, 1)<span class='macro_popup'>(WeatherInfo *) (__extension__ ({ gsize __n = (gsize) (1); gsize<br> __s = sizeof (WeatherInfo); gpointer __p; if (__s == 1) __p =<br> g_malloc0 (__n); else if (__builtin_constant_p (__n) &&<br> (__s == 0 || __n <= (9223372036854775807L *2UL+1UL) / __s<br>)) __p = g_malloc0 (__n * __s); else __p = g_malloc0_n (__n, __s<br>); __p; }))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="492"><td class="num" id="LN492">492</td><td class="line"> info->requests_pending = 0;</td></tr> +<tr class="codeline" data-linenumber="493"><td class="num" id="LN493">493</td><td class="line"> info->location = weather_location_clone (location);</td></tr> +<tr class="codeline" data-linenumber="494"><td class="num" id="LN494">494</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="495"><td class="num" id="LN495">495</td><td class="line"> location = <span class="mrange">info->location</span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:9ex">Value stored to 'location' is never read</div></td></tr> +<tr class="codeline" data-linenumber="496"><td class="num" id="LN496">496</td><td class="line"> <span class='keyword'>if</span> (info->forecast)</td></tr> +<tr class="codeline" data-linenumber="497"><td class="num" id="LN497">497</td><td class="line"> g_free (info->forecast);</td></tr> +<tr class="codeline" data-linenumber="498"><td class="num" id="LN498">498</td><td class="line"> info->forecast = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="499"><td class="num" id="LN499">499</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="500"><td class="num" id="LN500">500</td><td class="line"> free_forecast_list (info);</td></tr> +<tr class="codeline" data-linenumber="501"><td class="num" id="LN501">501</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="502"><td class="num" id="LN502">502</td><td class="line"> <span class='keyword'>if</span> (info->radar != <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="503"><td class="num" id="LN503">503</td><td class="line"> g_object_unref (info->radar);</td></tr> +<tr class="codeline" data-linenumber="504"><td class="num" id="LN504">504</td><td class="line"> info->radar = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="505"><td class="num" id="LN505">505</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="506"><td class="num" id="LN506">506</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="507"><td class="num" id="LN507">507</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="508"><td class="num" id="LN508">508</td><td class="line"> <span class='comment'>/* Update in progress */</span></td></tr> +<tr class="codeline" data-linenumber="509"><td class="num" id="LN509">509</td><td class="line"> <span class='keyword'>if</span> (!requests_init (info)) {</td></tr> +<tr class="codeline" data-linenumber="510"><td class="num" id="LN510">510</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="511"><td class="num" id="LN511">511</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="512"><td class="num" id="LN512">512</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="513"><td class="num" id="LN513">513</td><td class="line"> <span class='comment'>/* Defaults (just in case...) */</span></td></tr> +<tr class="codeline" data-linenumber="514"><td class="num" id="LN514">514</td><td class="line"> <span class='comment'>/* Well, no just in case anymore. We may actually fail to fetch some</span></td></tr> +<tr class="codeline" data-linenumber="515"><td class="num" id="LN515">515</td><td class="line"> <span class='comment'>* fields. */</span></td></tr> +<tr class="codeline" data-linenumber="516"><td class="num" id="LN516">516</td><td class="line"> info->forecast_type = prefs->type;</td></tr> +<tr class="codeline" data-linenumber="517"><td class="num" id="LN517">517</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="518"><td class="num" id="LN518">518</td><td class="line"> info->temperature_unit = prefs->temperature_unit;</td></tr> +<tr class="codeline" data-linenumber="519"><td class="num" id="LN519">519</td><td class="line"> info->speed_unit = prefs->speed_unit;</td></tr> +<tr class="codeline" data-linenumber="520"><td class="num" id="LN520">520</td><td class="line"> info->pressure_unit = prefs->pressure_unit;</td></tr> +<tr class="codeline" data-linenumber="521"><td class="num" id="LN521">521</td><td class="line"> info->distance_unit = prefs->distance_unit;</td></tr> +<tr class="codeline" data-linenumber="522"><td class="num" id="LN522">522</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="523"><td class="num" id="LN523">523</td><td class="line"> info->update = 0;</td></tr> +<tr class="codeline" data-linenumber="524"><td class="num" id="LN524">524</td><td class="line"> info->sky = -1;</td></tr> +<tr class="codeline" data-linenumber="525"><td class="num" id="LN525">525</td><td class="line"> info->cond.significant = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="526"><td class="num" id="LN526">526</td><td class="line"> info->cond.phenomenon = PHENOMENON_NONE;</td></tr> +<tr class="codeline" data-linenumber="527"><td class="num" id="LN527">527</td><td class="line"> info->cond.qualifier = QUALIFIER_NONE;</td></tr> +<tr class="codeline" data-linenumber="528"><td class="num" id="LN528">528</td><td class="line"> info->temp = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="529"><td class="num" id="LN529">529</td><td class="line"> info->tempMinMaxValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="530"><td class="num" id="LN530">530</td><td class="line"> info->temp_min = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="531"><td class="num" id="LN531">531</td><td class="line"> info->temp_max = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="532"><td class="num" id="LN532">532</td><td class="line"> info->dew = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="533"><td class="num" id="LN533">533</td><td class="line"> info->wind = -1;</td></tr> +<tr class="codeline" data-linenumber="534"><td class="num" id="LN534">534</td><td class="line"> info->windspeed = -1;</td></tr> +<tr class="codeline" data-linenumber="535"><td class="num" id="LN535">535</td><td class="line"> info->pressure = -1.0;</td></tr> +<tr class="codeline" data-linenumber="536"><td class="num" id="LN536">536</td><td class="line"> info->visibility = -1.0;</td></tr> +<tr class="codeline" data-linenumber="537"><td class="num" id="LN537">537</td><td class="line"> info->sunriseValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="538"><td class="num" id="LN538">538</td><td class="line"> info->sunsetValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="539"><td class="num" id="LN539">539</td><td class="line"> info->moonValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="540"><td class="num" id="LN540">540</td><td class="line"> info->sunrise = 0;</td></tr> +<tr class="codeline" data-linenumber="541"><td class="num" id="LN541">541</td><td class="line"> info->sunset = 0;</td></tr> +<tr class="codeline" data-linenumber="542"><td class="num" id="LN542">542</td><td class="line"> info->moonphase = 0;</td></tr> +<tr class="codeline" data-linenumber="543"><td class="num" id="LN543">543</td><td class="line"> info->moonlatitude = 0;</td></tr> +<tr class="codeline" data-linenumber="544"><td class="num" id="LN544">544</td><td class="line"> info->forecast = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="545"><td class="num" id="LN545">545</td><td class="line"> info->forecast_list = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="546"><td class="num" id="LN546">546</td><td class="line"> info->radar = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="547"><td class="num" id="LN547">547</td><td class="line"> info->radar_url = prefs->radar && prefs->radar_custom_url ?</td></tr> +<tr class="codeline" data-linenumber="548"><td class="num" id="LN548">548</td><td class="line"> <span class='macro'>g_strdup (prefs->radar_custom_url)<span class='macro_popup'>g_strdup_inline (prefs->radar_custom_url)</span></span> : <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="549"><td class="num" id="LN549">549</td><td class="line"> info->finish_cb = cb;</td></tr> +<tr class="codeline" data-linenumber="550"><td class="num" id="LN550">550</td><td class="line"> info->cb_data = data;</td></tr> +<tr class="codeline" data-linenumber="551"><td class="num" id="LN551">551</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="552"><td class="num" id="LN552">552</td><td class="line"> <span class='keyword'>if</span> (!info->session) {</td></tr> +<tr class="codeline" data-linenumber="553"><td class="num" id="LN553">553</td><td class="line"> info->session = soup_session_new ();</td></tr> +<tr class="codeline" data-linenumber="554"><td class="num" id="LN554">554</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="555"><td class="num" id="LN555">555</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="556"><td class="num" id="LN556">556</td><td class="line"> metar_start_open (info);</td></tr> +<tr class="codeline" data-linenumber="557"><td class="num" id="LN557">557</td><td class="line"> iwin_start_open (info);</td></tr> +<tr class="codeline" data-linenumber="558"><td class="num" id="LN558">558</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="559"><td class="num" id="LN559">559</td><td class="line"> <span class='keyword'>if</span> (prefs->radar) {</td></tr> +<tr class="codeline" data-linenumber="560"><td class="num" id="LN560">560</td><td class="line"> wx_start_open (info);</td></tr> +<tr class="codeline" data-linenumber="561"><td class="num" id="LN561">561</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="562"><td class="num" id="LN562">562</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="563"><td class="num" id="LN563">563</td><td class="line"> <span class='keyword'>return</span> info;</td></tr> +<tr class="codeline" data-linenumber="564"><td class="num" id="LN564">564</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="565"><td class="num" id="LN565">565</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="566"><td class="num" id="LN566">566</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="567"><td class="num" id="LN567">567</td><td class="line">weather_info_abort (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="568"><td class="num" id="LN568">568</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="569"><td class="num" id="LN569">569</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_83<br>; if (info != ((void*)0)) _g_boolean_var_83 = 1; else _g_boolean_var_83<br> = 0; _g_boolean_var_83; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="570"><td class="num" id="LN570">570</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="571"><td class="num" id="LN571">571</td><td class="line"> <span class='keyword'>if</span> (info->session) {</td></tr> +<tr class="codeline" data-linenumber="572"><td class="num" id="LN572">572</td><td class="line"> soup_session_abort (info->session);</td></tr> +<tr class="codeline" data-linenumber="573"><td class="num" id="LN573">573</td><td class="line"> info->requests_pending = 0;</td></tr> +<tr class="codeline" data-linenumber="574"><td class="num" id="LN574">574</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="575"><td class="num" id="LN575">575</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="576"><td class="num" id="LN576">576</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="577"><td class="num" id="LN577">577</td><td class="line">WeatherInfo *</td></tr> +<tr class="codeline" data-linenumber="578"><td class="num" id="LN578">578</td><td class="line">weather_info_clone (<span class='keyword'>const</span> WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="579"><td class="num" id="LN579">579</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="580"><td class="num" id="LN580">580</td><td class="line"> WeatherInfo *clone;</td></tr> +<tr class="codeline" data-linenumber="581"><td class="num" id="LN581">581</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="582"><td class="num" id="LN582">582</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_84<br>; if (info != ((void*)0)) _g_boolean_var_84 = 1; else _g_boolean_var_84<br> = 0; _g_boolean_var_84; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="583"><td class="num" id="LN583">583</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="584"><td class="num" id="LN584">584</td><td class="line"> clone = <span class='macro'>g_new (WeatherInfo, 1)<span class='macro_popup'>(WeatherInfo *) (__extension__ ({ gsize __n = (gsize) (1); gsize<br> __s = sizeof (WeatherInfo); gpointer __p; if (__s == 1) __p =<br> g_malloc (__n); else if (__builtin_constant_p (__n) &&<br> (__s == 0 || __n <= (9223372036854775807L *2UL+1UL) / __s<br>)) __p = g_malloc (__n * __s); else __p = g_malloc_n (__n, __s<br>); __p; }))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="585"><td class="num" id="LN585">585</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="586"><td class="num" id="LN586">586</td><td class="line"> <span class='comment'>/* move everything */</span></td></tr> +<tr class="codeline" data-linenumber="587"><td class="num" id="LN587">587</td><td class="line"> memmove (clone, info, <span class='keyword'>sizeof</span> (WeatherInfo));</td></tr> +<tr class="codeline" data-linenumber="588"><td class="num" id="LN588">588</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="589"><td class="num" id="LN589">589</td><td class="line"> <span class='comment'>/* special moves */</span></td></tr> +<tr class="codeline" data-linenumber="590"><td class="num" id="LN590">590</td><td class="line"> clone->location = weather_location_clone (info->location);</td></tr> +<tr class="codeline" data-linenumber="591"><td class="num" id="LN591">591</td><td class="line"> <span class='comment'>/* This handles null correctly */</span></td></tr> +<tr class="codeline" data-linenumber="592"><td class="num" id="LN592">592</td><td class="line"> clone->forecast = <span class='macro'>g_strdup (info->forecast)<span class='macro_popup'>g_strdup_inline (info->forecast)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="593"><td class="num" id="LN593">593</td><td class="line"> clone->radar_url = <span class='macro'>g_strdup (info->radar_url)<span class='macro_popup'>g_strdup_inline (info->radar_url)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="594"><td class="num" id="LN594">594</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="595"><td class="num" id="LN595">595</td><td class="line"> <span class='keyword'>if</span> (info->forecast_list) {</td></tr> +<tr class="codeline" data-linenumber="596"><td class="num" id="LN596">596</td><td class="line"> GSList *p;</td></tr> +<tr class="codeline" data-linenumber="597"><td class="num" id="LN597">597</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="598"><td class="num" id="LN598">598</td><td class="line"> clone->forecast_list = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="599"><td class="num" id="LN599">599</td><td class="line"> <span class='keyword'>for</span> (p = info->forecast_list; p; p = p->next) {</td></tr> +<tr class="codeline" data-linenumber="600"><td class="num" id="LN600">600</td><td class="line"> clone->forecast_list = g_slist_prepend (clone->forecast_list, weather_info_clone (p->data));</td></tr> +<tr class="codeline" data-linenumber="601"><td class="num" id="LN601">601</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="602"><td class="num" id="LN602">602</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="603"><td class="num" id="LN603">603</td><td class="line"> clone->forecast_list = g_slist_reverse (clone->forecast_list);</td></tr> +<tr class="codeline" data-linenumber="604"><td class="num" id="LN604">604</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="605"><td class="num" id="LN605">605</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="606"><td class="num" id="LN606">606</td><td class="line"> clone->radar = info->radar;</td></tr> +<tr class="codeline" data-linenumber="607"><td class="num" id="LN607">607</td><td class="line"> <span class='keyword'>if</span> (clone->radar != <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="608"><td class="num" id="LN608">608</td><td class="line"> <span class='macro'>g_object_ref (clone->radar)<span class='macro_popup'>((__typeof__ (clone->radar)) (g_object_ref) (clone->radar<br>))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="609"><td class="num" id="LN609">609</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="610"><td class="num" id="LN610">610</td><td class="line"> <span class='keyword'>return</span> clone;</td></tr> +<tr class="codeline" data-linenumber="611"><td class="num" id="LN611">611</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="612"><td class="num" id="LN612">612</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="613"><td class="num" id="LN613">613</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="614"><td class="num" id="LN614">614</td><td class="line">weather_info_free (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="615"><td class="num" id="LN615">615</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="616"><td class="num" id="LN616">616</td><td class="line"> <span class='keyword'>if</span> (!info)</td></tr> +<tr class="codeline" data-linenumber="617"><td class="num" id="LN617">617</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="618"><td class="num" id="LN618">618</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="619"><td class="num" id="LN619">619</td><td class="line"> weather_info_abort (info);</td></tr> +<tr class="codeline" data-linenumber="620"><td class="num" id="LN620">620</td><td class="line"> <span class='keyword'>if</span> (info->session)</td></tr> +<tr class="codeline" data-linenumber="621"><td class="num" id="LN621">621</td><td class="line"> g_object_unref (info->session);</td></tr> +<tr class="codeline" data-linenumber="622"><td class="num" id="LN622">622</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="623"><td class="num" id="LN623">623</td><td class="line"> weather_location_free (info->location);</td></tr> +<tr class="codeline" data-linenumber="624"><td class="num" id="LN624">624</td><td class="line"> info->location = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="625"><td class="num" id="LN625">625</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="626"><td class="num" id="LN626">626</td><td class="line"> g_free (info->forecast);</td></tr> +<tr class="codeline" data-linenumber="627"><td class="num" id="LN627">627</td><td class="line"> info->forecast = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="628"><td class="num" id="LN628">628</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="629"><td class="num" id="LN629">629</td><td class="line"> free_forecast_list (info);</td></tr> +<tr class="codeline" data-linenumber="630"><td class="num" id="LN630">630</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="631"><td class="num" id="LN631">631</td><td class="line"> <span class='keyword'>if</span> (info->radar != <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="632"><td class="num" id="LN632">632</td><td class="line"> g_object_unref (info->radar);</td></tr> +<tr class="codeline" data-linenumber="633"><td class="num" id="LN633">633</td><td class="line"> info->radar = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="634"><td class="num" id="LN634">634</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="635"><td class="num" id="LN635">635</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="636"><td class="num" id="LN636">636</td><td class="line"> g_free (info);</td></tr> +<tr class="codeline" data-linenumber="637"><td class="num" id="LN637">637</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="638"><td class="num" id="LN638">638</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="639"><td class="num" id="LN639">639</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="640"><td class="num" id="LN640">640</td><td class="line">weather_info_is_valid (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="641"><td class="num" id="LN641">641</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="642"><td class="num" id="LN642">642</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_85<br>; if (info != ((void*)0)) _g_boolean_var_85 = 1; else _g_boolean_var_85<br> = 0; _g_boolean_var_85; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="643"><td class="num" id="LN643">643</td><td class="line"> <span class='keyword'>return</span> info->valid;</td></tr> +<tr class="codeline" data-linenumber="644"><td class="num" id="LN644">644</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="645"><td class="num" id="LN645">645</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="646"><td class="num" id="LN646">646</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="647"><td class="num" id="LN647">647</td><td class="line">weather_info_network_error (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="648"><td class="num" id="LN648">648</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="649"><td class="num" id="LN649">649</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_86<br>; if (info != ((void*)0)) _g_boolean_var_86 = 1; else _g_boolean_var_86<br> = 0; _g_boolean_var_86; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="650"><td class="num" id="LN650">650</td><td class="line"> <span class='keyword'>return</span> info->network_error;</td></tr> +<tr class="codeline" data-linenumber="651"><td class="num" id="LN651">651</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="652"><td class="num" id="LN652">652</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="653"><td class="num" id="LN653">653</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="654"><td class="num" id="LN654">654</td><td class="line">weather_info_to_metric (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="655"><td class="num" id="LN655">655</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="656"><td class="num" id="LN656">656</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_87<br>; if (info != ((void*)0)) _g_boolean_var_87 = 1; else _g_boolean_var_87<br> = 0; _g_boolean_var_87; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="657"><td class="num" id="LN657">657</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="658"><td class="num" id="LN658">658</td><td class="line"> info->temperature_unit = TEMP_UNIT_CENTIGRADE;</td></tr> +<tr class="codeline" data-linenumber="659"><td class="num" id="LN659">659</td><td class="line"> info->speed_unit = SPEED_UNIT_MS;</td></tr> +<tr class="codeline" data-linenumber="660"><td class="num" id="LN660">660</td><td class="line"> info->pressure_unit = PRESSURE_UNIT_HPA;</td></tr> +<tr class="codeline" data-linenumber="661"><td class="num" id="LN661">661</td><td class="line"> info->distance_unit = DISTANCE_UNIT_METERS;</td></tr> +<tr class="codeline" data-linenumber="662"><td class="num" id="LN662">662</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="663"><td class="num" id="LN663">663</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="664"><td class="num" id="LN664">664</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="665"><td class="num" id="LN665">665</td><td class="line">weather_info_to_imperial (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="666"><td class="num" id="LN666">666</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="667"><td class="num" id="LN667">667</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_88<br>; if (info != ((void*)0)) _g_boolean_var_88 = 1; else _g_boolean_var_88<br> = 0; _g_boolean_var_88; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="668"><td class="num" id="LN668">668</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="669"><td class="num" id="LN669">669</td><td class="line"> info->temperature_unit = TEMP_UNIT_FAHRENHEIT;</td></tr> +<tr class="codeline" data-linenumber="670"><td class="num" id="LN670">670</td><td class="line"> info->speed_unit = SPEED_UNIT_MPH;</td></tr> +<tr class="codeline" data-linenumber="671"><td class="num" id="LN671">671</td><td class="line"> info->pressure_unit = PRESSURE_UNIT_INCH_HG;</td></tr> +<tr class="codeline" data-linenumber="672"><td class="num" id="LN672">672</td><td class="line"> info->distance_unit = DISTANCE_UNIT_MILES;</td></tr> +<tr class="codeline" data-linenumber="673"><td class="num" id="LN673">673</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="674"><td class="num" id="LN674">674</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="675"><td class="num" id="LN675">675</td><td class="line"><span class='keyword'>const</span> WeatherLocation *</td></tr> +<tr class="codeline" data-linenumber="676"><td class="num" id="LN676">676</td><td class="line">weather_info_get_location (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="677"><td class="num" id="LN677">677</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="678"><td class="num" id="LN678">678</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_89<br>; if (info != ((void*)0)) _g_boolean_var_89 = 1; else _g_boolean_var_89<br> = 0; _g_boolean_var_89; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="679"><td class="num" id="LN679">679</td><td class="line"> <span class='keyword'>return</span> info->location;</td></tr> +<tr class="codeline" data-linenumber="680"><td class="num" id="LN680">680</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="681"><td class="num" id="LN681">681</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="682"><td class="num" id="LN682">682</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="683"><td class="num" id="LN683">683</td><td class="line">weather_info_get_location_name (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="684"><td class="num" id="LN684">684</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="685"><td class="num" id="LN685">685</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_90<br>; if (info != ((void*)0)) _g_boolean_var_90 = 1; else _g_boolean_var_90<br> = 0; _g_boolean_var_90; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="686"><td class="num" id="LN686">686</td><td class="line"> <span class='macro'>g_return_val_if_fail (info->location != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_91<br>; if (info->location != ((void*)0)) _g_boolean_var_91 = 1;<br> else _g_boolean_var_91 = 0; _g_boolean_var_91; }), 1))) { } else<br> { g_return_if_fail_warning ("MateWeather", ((const char*) (__func__<br>)), "info->location != NULL"); return (((void*)0)); } } while<br> (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="687"><td class="num" id="LN687">687</td><td class="line"> <span class='keyword'>return</span> info->location->name;</td></tr> +<tr class="codeline" data-linenumber="688"><td class="num" id="LN688">688</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="689"><td class="num" id="LN689">689</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="690"><td class="num" id="LN690">690</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="691"><td class="num" id="LN691">691</td><td class="line">weather_info_get_update (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="692"><td class="num" id="LN692">692</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="693"><td class="num" id="LN693">693</td><td class="line"> <span class='keyword'>static</span> gchar buf[200];</td></tr> +<tr class="codeline" data-linenumber="694"><td class="num" id="LN694">694</td><td class="line"> <span class='keyword'>char</span> *utf8, *timeformat;</td></tr> +<tr class="codeline" data-linenumber="695"><td class="num" id="LN695">695</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="696"><td class="num" id="LN696">696</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_92<br>; if (info != ((void*)0)) _g_boolean_var_92 = 1; else _g_boolean_var_92<br> = 0; _g_boolean_var_92; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="697"><td class="num" id="LN697">697</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="698"><td class="num" id="LN698">698</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="699"><td class="num" id="LN699">699</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="700"><td class="num" id="LN700">700</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="701"><td class="num" id="LN701">701</td><td class="line"> <span class='keyword'>if</span> (info->update != 0) {</td></tr> +<tr class="codeline" data-linenumber="702"><td class="num" id="LN702">702</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="703"><td class="num" id="LN703">703</td><td class="line"> localtime_r (&info->update, &tm);</td></tr> +<tr class="codeline" data-linenumber="704"><td class="num" id="LN704">704</td><td class="line"> <span class='comment'>/* Translators: this is a format string for strftime</span></td></tr> +<tr class="codeline" data-linenumber="705"><td class="num" id="LN705">705</td><td class="line"> <span class='comment'>* see `man 3 strftime` for more details</span></td></tr> +<tr class="codeline" data-linenumber="706"><td class="num" id="LN706">706</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="707"><td class="num" id="LN707">707</td><td class="line"> timeformat = g_locale_from_utf8 (<span class='macro'>_(<span class='string_literal'>"%a, %b %d / %H:%M"</span>)<span class='macro_popup'>(mateweather_gettext ("%a, %b %d / %H:%M"))</span></span>, -1,</td></tr> +<tr class="codeline" data-linenumber="708"><td class="num" id="LN708">708</td><td class="line"> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="709"><td class="num" id="LN709">709</td><td class="line"> <span class='keyword'>if</span> (!timeformat) {</td></tr> +<tr class="codeline" data-linenumber="710"><td class="num" id="LN710">710</td><td class="line"> strcpy (buf, <span class='string_literal'>"???"</span>);</td></tr> +<tr class="codeline" data-linenumber="711"><td class="num" id="LN711">711</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="712"><td class="num" id="LN712">712</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (strftime (buf, <span class='keyword'>sizeof</span> (buf), timeformat, &tm) <= 0) {</td></tr> +<tr class="codeline" data-linenumber="713"><td class="num" id="LN713">713</td><td class="line"> strcpy (buf, <span class='string_literal'>"???"</span>);</td></tr> +<tr class="codeline" data-linenumber="714"><td class="num" id="LN714">714</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="715"><td class="num" id="LN715">715</td><td class="line"> g_free (timeformat);</td></tr> +<tr class="codeline" data-linenumber="716"><td class="num" id="LN716">716</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="717"><td class="num" id="LN717">717</td><td class="line"> <span class='comment'>/* Convert to UTF-8 */</span></td></tr> +<tr class="codeline" data-linenumber="718"><td class="num" id="LN718">718</td><td class="line"> utf8 = g_locale_to_utf8 (buf, -1, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="719"><td class="num" id="LN719">719</td><td class="line"> strcpy (buf, utf8);</td></tr> +<tr class="codeline" data-linenumber="720"><td class="num" id="LN720">720</td><td class="line"> g_free (utf8);</td></tr> +<tr class="codeline" data-linenumber="721"><td class="num" id="LN721">721</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="722"><td class="num" id="LN722">722</td><td class="line"> strncpy (buf, <span class='macro'>_(<span class='string_literal'>"Unknown observation time"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown observation time"))</span></span>, <span class='keyword'>sizeof</span> (buf));</td></tr> +<tr class="codeline" data-linenumber="723"><td class="num" id="LN723">723</td><td class="line"> buf[<span class='keyword'>sizeof</span> (buf)-1] = '\0';</td></tr> +<tr class="codeline" data-linenumber="724"><td class="num" id="LN724">724</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="725"><td class="num" id="LN725">725</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="726"><td class="num" id="LN726">726</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="727"><td class="num" id="LN727">727</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="728"><td class="num" id="LN728">728</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="729"><td class="num" id="LN729">729</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="730"><td class="num" id="LN730">730</td><td class="line">weather_info_get_sky (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="731"><td class="num" id="LN731">731</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="732"><td class="num" id="LN732">732</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_93<br>; if (info != ((void*)0)) _g_boolean_var_93 = 1; else _g_boolean_var_93<br> = 0; _g_boolean_var_93; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="733"><td class="num" id="LN733">733</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="734"><td class="num" id="LN734">734</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="735"><td class="num" id="LN735">735</td><td class="line"> <span class='keyword'>if</span> (info->sky < 0)</td></tr> +<tr class="codeline" data-linenumber="736"><td class="num" id="LN736">736</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="737"><td class="num" id="LN737">737</td><td class="line"> <span class='keyword'>return</span> weather_sky_string (info->sky);</td></tr> +<tr class="codeline" data-linenumber="738"><td class="num" id="LN738">738</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="739"><td class="num" id="LN739">739</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="740"><td class="num" id="LN740">740</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="741"><td class="num" id="LN741">741</td><td class="line">weather_info_get_conditions (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="742"><td class="num" id="LN742">742</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="743"><td class="num" id="LN743">743</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_94<br>; if (info != ((void*)0)) _g_boolean_var_94 = 1; else _g_boolean_var_94<br> = 0; _g_boolean_var_94; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="744"><td class="num" id="LN744">744</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="745"><td class="num" id="LN745">745</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="746"><td class="num" id="LN746">746</td><td class="line"> <span class='keyword'>return</span> weather_conditions_string (info->cond);</td></tr> +<tr class="codeline" data-linenumber="747"><td class="num" id="LN747">747</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="748"><td class="num" id="LN748">748</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="749"><td class="num" id="LN749">749</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="750"><td class="num" id="LN750">750</td><td class="line">temperature_string (gdouble temp, TempUnit to_unit, gboolean want_round)</td></tr> +<tr class="codeline" data-linenumber="751"><td class="num" id="LN751">751</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="752"><td class="num" id="LN752">752</td><td class="line"> <span class='keyword'>static</span> gchar buf[100];</td></tr> +<tr class="codeline" data-linenumber="753"><td class="num" id="LN753">753</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="754"><td class="num" id="LN754">754</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="755"><td class="num" id="LN755">755</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_FAHRENHEIT:</td></tr> +<tr class="codeline" data-linenumber="756"><td class="num" id="LN756">756</td><td class="line"> <span class='keyword'>if</span> (!want_round) {</td></tr> +<tr class="codeline" data-linenumber="757"><td class="num" id="LN757">757</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) */</span></td></tr> +<tr class="codeline" data-linenumber="758"><td class="num" id="LN758">758</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f \302\260F"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f \302\260F"))</span></span>, temp);</td></tr> +<tr class="codeline" data-linenumber="759"><td class="num" id="LN759">759</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="760"><td class="num" id="LN760">760</td><td class="line"> <span class='keyword'>const</span> <span class='keyword'>int</span> range_problem = <span class='macro'>FE_INVALID<span class='macro_popup'>0x01</span></span> | <span class='macro'>FE_DIVBYZERO<span class='macro_popup'>0x04</span></span> | <span class='macro'>FE_OVERFLOW<span class='macro_popup'>0x08</span></span> | <span class='macro'>FE_UNDERFLOW<span class='macro_popup'>0x10</span></span>;</td></tr> +<tr class="codeline" data-linenumber="761"><td class="num" id="LN761">761</td><td class="line"> gdouble temp_r;</td></tr> +<tr class="codeline" data-linenumber="762"><td class="num" id="LN762">762</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="763"><td class="num" id="LN763">763</td><td class="line"> feclearexcept(range_problem);</td></tr> +<tr class="codeline" data-linenumber="764"><td class="num" id="LN764">764</td><td class="line"> temp_r = round (temp);</td></tr> +<tr class="codeline" data-linenumber="765"><td class="num" id="LN765">765</td><td class="line"> <span class='keyword'>if</span> (fetestexcept(range_problem))</td></tr> +<tr class="codeline" data-linenumber="766"><td class="num" id="LN766">766</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"n/a"</span>)<span class='macro_popup'>(mateweather_gettext ("n/a"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="767"><td class="num" id="LN767">767</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="768"><td class="num" id="LN768">768</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) */</span></td></tr> +<tr class="codeline" data-linenumber="769"><td class="num" id="LN769">769</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%d \302\260F"</span>)<span class='macro_popup'>(mateweather_gettext ("%d \302\260F"))</span></span>, (<span class='keyword'>int</span>)temp_r);</td></tr> +<tr class="codeline" data-linenumber="770"><td class="num" id="LN770">770</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="771"><td class="num" id="LN771">771</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="772"><td class="num" id="LN772">772</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_CENTIGRADE:</td></tr> +<tr class="codeline" data-linenumber="773"><td class="num" id="LN773">773</td><td class="line"> <span class='keyword'>if</span> (!want_round) {</td></tr> +<tr class="codeline" data-linenumber="774"><td class="num" id="LN774">774</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) */</span></td></tr> +<tr class="codeline" data-linenumber="775"><td class="num" id="LN775">775</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f \302\260C"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f \302\260C"))</span></span>, <span class='macro'>TEMP_F_TO_C (temp)<span class='macro_popup'>(((temp) - 32.0) * (5.0/9.0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="776"><td class="num" id="LN776">776</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="777"><td class="num" id="LN777">777</td><td class="line"> <span class='keyword'>const</span> <span class='keyword'>int</span> range_problem = <span class='macro'>FE_INVALID<span class='macro_popup'>0x01</span></span> | <span class='macro'>FE_DIVBYZERO<span class='macro_popup'>0x04</span></span> | <span class='macro'>FE_OVERFLOW<span class='macro_popup'>0x08</span></span> | <span class='macro'>FE_UNDERFLOW<span class='macro_popup'>0x10</span></span>;</td></tr> +<tr class="codeline" data-linenumber="778"><td class="num" id="LN778">778</td><td class="line"> gdouble temp_r;</td></tr> +<tr class="codeline" data-linenumber="779"><td class="num" id="LN779">779</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="780"><td class="num" id="LN780">780</td><td class="line"> feclearexcept(range_problem);</td></tr> +<tr class="codeline" data-linenumber="781"><td class="num" id="LN781">781</td><td class="line"> temp_r = round (<span class='macro'>TEMP_F_TO_C (temp)<span class='macro_popup'>(((temp) - 32.0) * (5.0/9.0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="782"><td class="num" id="LN782">782</td><td class="line"> <span class='keyword'>if</span> (fetestexcept(range_problem))</td></tr> +<tr class="codeline" data-linenumber="783"><td class="num" id="LN783">783</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"n/a"</span>)<span class='macro_popup'>(mateweather_gettext ("n/a"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="784"><td class="num" id="LN784">784</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="785"><td class="num" id="LN785">785</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) */</span></td></tr> +<tr class="codeline" data-linenumber="786"><td class="num" id="LN786">786</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%d \302\260C"</span>)<span class='macro_popup'>(mateweather_gettext ("%d \302\260C"))</span></span>, (<span class='keyword'>int</span>)temp_r);</td></tr> +<tr class="codeline" data-linenumber="787"><td class="num" id="LN787">787</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="788"><td class="num" id="LN788">788</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="789"><td class="num" id="LN789">789</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_KELVIN:</td></tr> +<tr class="codeline" data-linenumber="790"><td class="num" id="LN790">790</td><td class="line"> <span class='keyword'>if</span> (!want_round) {</td></tr> +<tr class="codeline" data-linenumber="791"><td class="num" id="LN791">791</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in kelvin */</span></td></tr> +<tr class="codeline" data-linenumber="792"><td class="num" id="LN792">792</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f K"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f K"))</span></span>, <span class='macro'>TEMP_F_TO_K (temp)<span class='macro_popup'>((temp + 459.67) * (5.0/9.0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="793"><td class="num" id="LN793">793</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="794"><td class="num" id="LN794">794</td><td class="line"> <span class='keyword'>const</span> <span class='keyword'>int</span> range_problem = <span class='macro'>FE_INVALID<span class='macro_popup'>0x01</span></span> | <span class='macro'>FE_DIVBYZERO<span class='macro_popup'>0x04</span></span> | <span class='macro'>FE_OVERFLOW<span class='macro_popup'>0x08</span></span> | <span class='macro'>FE_UNDERFLOW<span class='macro_popup'>0x10</span></span>;</td></tr> +<tr class="codeline" data-linenumber="795"><td class="num" id="LN795">795</td><td class="line"> gdouble temp_r;</td></tr> +<tr class="codeline" data-linenumber="796"><td class="num" id="LN796">796</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="797"><td class="num" id="LN797">797</td><td class="line"> feclearexcept(range_problem);</td></tr> +<tr class="codeline" data-linenumber="798"><td class="num" id="LN798">798</td><td class="line"> temp_r = round (<span class='macro'>TEMP_F_TO_K (temp)<span class='macro_popup'>((temp + 459.67) * (5.0/9.0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="799"><td class="num" id="LN799">799</td><td class="line"> <span class='keyword'>if</span> (fetestexcept(range_problem))</td></tr> +<tr class="codeline" data-linenumber="800"><td class="num" id="LN800">800</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"n/a"</span>)<span class='macro_popup'>(mateweather_gettext ("n/a"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="801"><td class="num" id="LN801">801</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="802"><td class="num" id="LN802">802</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in kelvin */</span></td></tr> +<tr class="codeline" data-linenumber="803"><td class="num" id="LN803">803</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%d K"</span>)<span class='macro_popup'>(mateweather_gettext ("%d K"))</span></span>, (<span class='keyword'>int</span>)temp_r);</td></tr> +<tr class="codeline" data-linenumber="804"><td class="num" id="LN804">804</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="805"><td class="num" id="LN805">805</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="806"><td class="num" id="LN806">806</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="807"><td class="num" id="LN807">807</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="808"><td class="num" id="LN808">808</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="809"><td class="num" id="LN809">809</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="810"><td class="num" id="LN810">810</td><td class="line"> g_warning (<span class='string_literal'>"Conversion to illegal temperature unit: %d"</span>, to_unit);</td></tr> +<tr class="codeline" data-linenumber="811"><td class="num" id="LN811">811</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="812"><td class="num" id="LN812">812</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="813"><td class="num" id="LN813">813</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="814"><td class="num" id="LN814">814</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="815"><td class="num" id="LN815">815</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="816"><td class="num" id="LN816">816</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="817"><td class="num" id="LN817">817</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="818"><td class="num" id="LN818">818</td><td class="line">weather_info_get_temp (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="819"><td class="num" id="LN819">819</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="820"><td class="num" id="LN820">820</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_95<br>; if (info != ((void*)0)) _g_boolean_var_95 = 1; else _g_boolean_var_95<br> = 0; _g_boolean_var_95; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="821"><td class="num" id="LN821">821</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="822"><td class="num" id="LN822">822</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="823"><td class="num" id="LN823">823</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="824"><td class="num" id="LN824">824</td><td class="line"> <span class='keyword'>if</span> (info->temp < -500.0)</td></tr> +<tr class="codeline" data-linenumber="825"><td class="num" id="LN825">825</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="826"><td class="num" id="LN826">826</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="827"><td class="num" id="LN827">827</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->temp, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="828"><td class="num" id="LN828">828</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="829"><td class="num" id="LN829">829</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="830"><td class="num" id="LN830">830</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="831"><td class="num" id="LN831">831</td><td class="line">weather_info_get_temp_min (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="832"><td class="num" id="LN832">832</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="833"><td class="num" id="LN833">833</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_96<br>; if (info != ((void*)0)) _g_boolean_var_96 = 1; else _g_boolean_var_96<br> = 0; _g_boolean_var_96; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="834"><td class="num" id="LN834">834</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="835"><td class="num" id="LN835">835</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->tempMinMaxValid)</td></tr> +<tr class="codeline" data-linenumber="836"><td class="num" id="LN836">836</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="837"><td class="num" id="LN837">837</td><td class="line"> <span class='keyword'>if</span> (info->temp_min < -500.0)</td></tr> +<tr class="codeline" data-linenumber="838"><td class="num" id="LN838">838</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="839"><td class="num" id="LN839">839</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="840"><td class="num" id="LN840">840</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->temp_min, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="841"><td class="num" id="LN841">841</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="842"><td class="num" id="LN842">842</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="843"><td class="num" id="LN843">843</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="844"><td class="num" id="LN844">844</td><td class="line">weather_info_get_temp_max (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="845"><td class="num" id="LN845">845</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="846"><td class="num" id="LN846">846</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_97<br>; if (info != ((void*)0)) _g_boolean_var_97 = 1; else _g_boolean_var_97<br> = 0; _g_boolean_var_97; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="847"><td class="num" id="LN847">847</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="848"><td class="num" id="LN848">848</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->tempMinMaxValid)</td></tr> +<tr class="codeline" data-linenumber="849"><td class="num" id="LN849">849</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="850"><td class="num" id="LN850">850</td><td class="line"> <span class='keyword'>if</span> (info->temp_max < -500.0)</td></tr> +<tr class="codeline" data-linenumber="851"><td class="num" id="LN851">851</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="852"><td class="num" id="LN852">852</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="853"><td class="num" id="LN853">853</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->temp_max, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="854"><td class="num" id="LN854">854</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="855"><td class="num" id="LN855">855</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="856"><td class="num" id="LN856">856</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="857"><td class="num" id="LN857">857</td><td class="line">weather_info_get_dew (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="858"><td class="num" id="LN858">858</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="859"><td class="num" id="LN859">859</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_98<br>; if (info != ((void*)0)) _g_boolean_var_98 = 1; else _g_boolean_var_98<br> = 0; _g_boolean_var_98; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="860"><td class="num" id="LN860">860</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="861"><td class="num" id="LN861">861</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="862"><td class="num" id="LN862">862</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="863"><td class="num" id="LN863">863</td><td class="line"> <span class='keyword'>if</span> (info->dew < -500.0)</td></tr> +<tr class="codeline" data-linenumber="864"><td class="num" id="LN864">864</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="865"><td class="num" id="LN865">865</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="866"><td class="num" id="LN866">866</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->dew, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="867"><td class="num" id="LN867">867</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="868"><td class="num" id="LN868">868</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="869"><td class="num" id="LN869">869</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="870"><td class="num" id="LN870">870</td><td class="line">weather_info_get_humidity (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="871"><td class="num" id="LN871">871</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="872"><td class="num" id="LN872">872</td><td class="line"> <span class='keyword'>static</span> gchar buf[20];</td></tr> +<tr class="codeline" data-linenumber="873"><td class="num" id="LN873">873</td><td class="line"> gdouble humidity;</td></tr> +<tr class="codeline" data-linenumber="874"><td class="num" id="LN874">874</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="875"><td class="num" id="LN875">875</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_99<br>; if (info != ((void*)0)) _g_boolean_var_99 = 1; else _g_boolean_var_99<br> = 0; _g_boolean_var_99; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="876"><td class="num" id="LN876">876</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="877"><td class="num" id="LN877">877</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="878"><td class="num" id="LN878">878</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="879"><td class="num" id="LN879">879</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="880"><td class="num" id="LN880">880</td><td class="line"> humidity = calc_humidity (info->temp, info->dew);</td></tr> +<tr class="codeline" data-linenumber="881"><td class="num" id="LN881">881</td><td class="line"> <span class='keyword'>if</span> (humidity < 0.0)</td></tr> +<tr class="codeline" data-linenumber="882"><td class="num" id="LN882">882</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="883"><td class="num" id="LN883">883</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="884"><td class="num" id="LN884">884</td><td class="line"> <span class='comment'>/* Translators: This is the humidity in percent */</span></td></tr> +<tr class="codeline" data-linenumber="885"><td class="num" id="LN885">885</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.f%%"</span>)<span class='macro_popup'>(mateweather_gettext ("%.f%%"))</span></span>, humidity);</td></tr> +<tr class="codeline" data-linenumber="886"><td class="num" id="LN886">886</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="887"><td class="num" id="LN887">887</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="888"><td class="num" id="LN888">888</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="889"><td class="num" id="LN889">889</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="890"><td class="num" id="LN890">890</td><td class="line">weather_info_get_apparent (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="891"><td class="num" id="LN891">891</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="892"><td class="num" id="LN892">892</td><td class="line"> gdouble apparent;</td></tr> +<tr class="codeline" data-linenumber="893"><td class="num" id="LN893">893</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="894"><td class="num" id="LN894">894</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_100<br>; if (info != ((void*)0)) _g_boolean_var_100 = 1; else _g_boolean_var_100<br> = 0; _g_boolean_var_100; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="895"><td class="num" id="LN895">895</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="896"><td class="num" id="LN896">896</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="897"><td class="num" id="LN897">897</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="898"><td class="num" id="LN898">898</td><td class="line"> apparent = calc_apparent (info);</td></tr> +<tr class="codeline" data-linenumber="899"><td class="num" id="LN899">899</td><td class="line"> <span class='keyword'>if</span> (apparent < -500.0)</td></tr> +<tr class="codeline" data-linenumber="900"><td class="num" id="LN900">900</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="901"><td class="num" id="LN901">901</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="902"><td class="num" id="LN902">902</td><td class="line"> <span class='keyword'>return</span> temperature_string (apparent, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="903"><td class="num" id="LN903">903</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="904"><td class="num" id="LN904">904</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="905"><td class="num" id="LN905">905</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="906"><td class="num" id="LN906">906</td><td class="line">windspeed_string (gfloat knots, SpeedUnit to_unit)</td></tr> +<tr class="codeline" data-linenumber="907"><td class="num" id="LN907">907</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="908"><td class="num" id="LN908">908</td><td class="line"> <span class='keyword'>static</span> gchar buf[100];</td></tr> +<tr class="codeline" data-linenumber="909"><td class="num" id="LN909">909</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="910"><td class="num" id="LN910">910</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="911"><td class="num" id="LN911">911</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_KNOTS:</td></tr> +<tr class="codeline" data-linenumber="912"><td class="num" id="LN912">912</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed in knots */</span></td></tr> +<tr class="codeline" data-linenumber="913"><td class="num" id="LN913">913</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%0.1f knots"</span>)<span class='macro_popup'>(mateweather_gettext ("%0.1f knots"))</span></span>, knots);</td></tr> +<tr class="codeline" data-linenumber="914"><td class="num" id="LN914">914</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="915"><td class="num" id="LN915">915</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_MPH:</td></tr> +<tr class="codeline" data-linenumber="916"><td class="num" id="LN916">916</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed in miles per hour */</span></td></tr> +<tr class="codeline" data-linenumber="917"><td class="num" id="LN917">917</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f mph"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f mph"))</span></span>, <span class='macro'>WINDSPEED_KNOTS_TO_MPH (knots)<span class='macro_popup'>((knots) * 1.150779)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="918"><td class="num" id="LN918">918</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="919"><td class="num" id="LN919">919</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_KPH:</td></tr> +<tr class="codeline" data-linenumber="920"><td class="num" id="LN920">920</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed in kilometers per hour */</span></td></tr> +<tr class="codeline" data-linenumber="921"><td class="num" id="LN921">921</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f km/h"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f km/h"))</span></span>, <span class='macro'>WINDSPEED_KNOTS_TO_KPH (knots)<span class='macro_popup'>((knots) * 1.851965)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="922"><td class="num" id="LN922">922</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="923"><td class="num" id="LN923">923</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_MS:</td></tr> +<tr class="codeline" data-linenumber="924"><td class="num" id="LN924">924</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed in meters per second */</span></td></tr> +<tr class="codeline" data-linenumber="925"><td class="num" id="LN925">925</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f m/s"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f m/s"))</span></span>, <span class='macro'>WINDSPEED_KNOTS_TO_MS (knots)<span class='macro_popup'>((knots) * 0.514444)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="926"><td class="num" id="LN926">926</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="927"><td class="num" id="LN927">927</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_BFT:</td></tr> +<tr class="codeline" data-linenumber="928"><td class="num" id="LN928">928</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed as a Beaufort force factor</span></td></tr> +<tr class="codeline" data-linenumber="929"><td class="num" id="LN929">929</td><td class="line"> <span class='comment'>* (commonly used in nautical wind estimation).</span></td></tr> +<tr class="codeline" data-linenumber="930"><td class="num" id="LN930">930</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="931"><td class="num" id="LN931">931</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"Beaufort force %.1f"</span>)<span class='macro_popup'>(mateweather_gettext ("Beaufort force %.1f"))</span></span>,</td></tr> +<tr class="codeline" data-linenumber="932"><td class="num" id="LN932">932</td><td class="line"> <span class='macro'>WINDSPEED_KNOTS_TO_BFT (knots)<span class='macro_popup'>(pow ((knots) * 0.615363, 0.666666))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="933"><td class="num" id="LN933">933</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="934"><td class="num" id="LN934">934</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="935"><td class="num" id="LN935">935</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="936"><td class="num" id="LN936">936</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="937"><td class="num" id="LN937">937</td><td class="line"> g_warning (<span class='string_literal'>"Conversion to illegal speed unit: %d"</span>, to_unit);</td></tr> +<tr class="codeline" data-linenumber="938"><td class="num" id="LN938">938</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="939"><td class="num" id="LN939">939</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="940"><td class="num" id="LN940">940</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="941"><td class="num" id="LN941">941</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="942"><td class="num" id="LN942">942</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="943"><td class="num" id="LN943">943</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="944"><td class="num" id="LN944">944</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="945"><td class="num" id="LN945">945</td><td class="line">weather_info_get_wind (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="946"><td class="num" id="LN946">946</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="947"><td class="num" id="LN947">947</td><td class="line"> <span class='keyword'>static</span> gchar buf[200];</td></tr> +<tr class="codeline" data-linenumber="948"><td class="num" id="LN948">948</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="949"><td class="num" id="LN949">949</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_101<br>; if (info != ((void*)0)) _g_boolean_var_101 = 1; else _g_boolean_var_101<br> = 0; _g_boolean_var_101; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="950"><td class="num" id="LN950">950</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="951"><td class="num" id="LN951">951</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="952"><td class="num" id="LN952">952</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="953"><td class="num" id="LN953">953</td><td class="line"> <span class='keyword'>if</span> (info->windspeed < 0.0 || info->wind < 0)</td></tr> +<tr class="codeline" data-linenumber="954"><td class="num" id="LN954">954</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="955"><td class="num" id="LN955">955</td><td class="line"> <span class='keyword'>if</span> (info->windspeed == 0.00) {</td></tr> +<tr class="codeline" data-linenumber="956"><td class="num" id="LN956">956</td><td class="line"> strncpy (buf, <span class='macro'>_(<span class='string_literal'>"Calm"</span>)<span class='macro_popup'>(mateweather_gettext ("Calm"))</span></span>, <span class='keyword'>sizeof</span> (buf));</td></tr> +<tr class="codeline" data-linenumber="957"><td class="num" id="LN957">957</td><td class="line"> buf[<span class='keyword'>sizeof</span> (buf)-1] = '\0';</td></tr> +<tr class="codeline" data-linenumber="958"><td class="num" id="LN958">958</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="959"><td class="num" id="LN959">959</td><td class="line"> <span class='comment'>/* Translators: This is 'wind direction' / 'wind speed' */</span></td></tr> +<tr class="codeline" data-linenumber="960"><td class="num" id="LN960">960</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%s / %s"</span>)<span class='macro_popup'>(mateweather_gettext ("%s / %s"))</span></span>,</td></tr> +<tr class="codeline" data-linenumber="961"><td class="num" id="LN961">961</td><td class="line"> weather_wind_direction_string (info->wind),</td></tr> +<tr class="codeline" data-linenumber="962"><td class="num" id="LN962">962</td><td class="line"> windspeed_string (info->windspeed, info->speed_unit));</td></tr> +<tr class="codeline" data-linenumber="963"><td class="num" id="LN963">963</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="964"><td class="num" id="LN964">964</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="965"><td class="num" id="LN965">965</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="966"><td class="num" id="LN966">966</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="967"><td class="num" id="LN967">967</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="968"><td class="num" id="LN968">968</td><td class="line">weather_info_get_pressure (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="969"><td class="num" id="LN969">969</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="970"><td class="num" id="LN970">970</td><td class="line"> <span class='keyword'>static</span> gchar buf[100];</td></tr> +<tr class="codeline" data-linenumber="971"><td class="num" id="LN971">971</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="972"><td class="num" id="LN972">972</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_102<br>; if (info != ((void*)0)) _g_boolean_var_102 = 1; else _g_boolean_var_102<br> = 0; _g_boolean_var_102; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="973"><td class="num" id="LN973">973</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="974"><td class="num" id="LN974">974</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="975"><td class="num" id="LN975">975</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="976"><td class="num" id="LN976">976</td><td class="line"> <span class='keyword'>if</span> (info->pressure < 0.0)</td></tr> +<tr class="codeline" data-linenumber="977"><td class="num" id="LN977">977</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="978"><td class="num" id="LN978">978</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="979"><td class="num" id="LN979">979</td><td class="line"> <span class='keyword'>switch</span> (info->pressure_unit) {</td></tr> +<tr class="codeline" data-linenumber="980"><td class="num" id="LN980">980</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_INCH_HG:</td></tr> +<tr class="codeline" data-linenumber="981"><td class="num" id="LN981">981</td><td class="line"> <span class='comment'>/* Translators: This is pressure in inches of mercury */</span></td></tr> +<tr class="codeline" data-linenumber="982"><td class="num" id="LN982">982</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.2f inHg"</span>)<span class='macro_popup'>(mateweather_gettext ("%.2f inHg"))</span></span>, info->pressure);</td></tr> +<tr class="codeline" data-linenumber="983"><td class="num" id="LN983">983</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="984"><td class="num" id="LN984">984</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_MM_HG:</td></tr> +<tr class="codeline" data-linenumber="985"><td class="num" id="LN985">985</td><td class="line"> <span class='comment'>/* Translators: This is pressure in millimeters of mercury */</span></td></tr> +<tr class="codeline" data-linenumber="986"><td class="num" id="LN986">986</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f mmHg"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f mmHg"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_MM (info->pressure)<span class='macro_popup'>((info->pressure) * 25.40005)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="987"><td class="num" id="LN987">987</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="988"><td class="num" id="LN988">988</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_KPA:</td></tr> +<tr class="codeline" data-linenumber="989"><td class="num" id="LN989">989</td><td class="line"> <span class='comment'>/* Translators: This is pressure in kiloPascals */</span></td></tr> +<tr class="codeline" data-linenumber="990"><td class="num" id="LN990">990</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.2f kPa"</span>)<span class='macro_popup'>(mateweather_gettext ("%.2f kPa"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_KPA (info->pressure)<span class='macro_popup'>((info->pressure) * 3.386)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="991"><td class="num" id="LN991">991</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="992"><td class="num" id="LN992">992</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_HPA:</td></tr> +<tr class="codeline" data-linenumber="993"><td class="num" id="LN993">993</td><td class="line"> <span class='comment'>/* Translators: This is pressure in hectoPascals */</span></td></tr> +<tr class="codeline" data-linenumber="994"><td class="num" id="LN994">994</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.2f hPa"</span>)<span class='macro_popup'>(mateweather_gettext ("%.2f hPa"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_HPA (info->pressure)<span class='macro_popup'>((info->pressure) * 33.86)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="995"><td class="num" id="LN995">995</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="996"><td class="num" id="LN996">996</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_MB:</td></tr> +<tr class="codeline" data-linenumber="997"><td class="num" id="LN997">997</td><td class="line"> <span class='comment'>/* Translators: This is pressure in millibars */</span></td></tr> +<tr class="codeline" data-linenumber="998"><td class="num" id="LN998">998</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.2f mb"</span>)<span class='macro_popup'>(mateweather_gettext ("%.2f mb"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_MB (info->pressure)<span class='macro_popup'>(((info->pressure) * 33.86))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="999"><td class="num" id="LN999">999</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1000"><td class="num" id="LN1000">1000</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_ATM:</td></tr> +<tr class="codeline" data-linenumber="1001"><td class="num" id="LN1001">1001</td><td class="line"> <span class='comment'>/* Translators: This is pressure in atmospheres */</span></td></tr> +<tr class="codeline" data-linenumber="1002"><td class="num" id="LN1002">1002</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.3f atm"</span>)<span class='macro_popup'>(mateweather_gettext ("%.3f atm"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_ATM (info->pressure)<span class='macro_popup'>((info->pressure) * 0.033421052)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1003"><td class="num" id="LN1003">1003</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1004"><td class="num" id="LN1004">1004</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1005"><td class="num" id="LN1005">1005</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1006"><td class="num" id="LN1006">1006</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1007"><td class="num" id="LN1007">1007</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1008"><td class="num" id="LN1008">1008</td><td class="line"> g_warning (<span class='string_literal'>"Conversion to illegal pressure unit: %d"</span>, info->pressure_unit);</td></tr> +<tr class="codeline" data-linenumber="1009"><td class="num" id="LN1009">1009</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1010"><td class="num" id="LN1010">1010</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1011"><td class="num" id="LN1011">1011</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1012"><td class="num" id="LN1012">1012</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="1013"><td class="num" id="LN1013">1013</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1014"><td class="num" id="LN1014">1014</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1015"><td class="num" id="LN1015">1015</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1016"><td class="num" id="LN1016">1016</td><td class="line">weather_info_get_visibility (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1017"><td class="num" id="LN1017">1017</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1018"><td class="num" id="LN1018">1018</td><td class="line"> <span class='keyword'>static</span> gchar buf[100];</td></tr> +<tr class="codeline" data-linenumber="1019"><td class="num" id="LN1019">1019</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1020"><td class="num" id="LN1020">1020</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_103<br>; if (info != ((void*)0)) _g_boolean_var_103 = 1; else _g_boolean_var_103<br> = 0; _g_boolean_var_103; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1021"><td class="num" id="LN1021">1021</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1022"><td class="num" id="LN1022">1022</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1023"><td class="num" id="LN1023">1023</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1024"><td class="num" id="LN1024">1024</td><td class="line"> <span class='keyword'>if</span> (info->visibility < 0.0)</td></tr> +<tr class="codeline" data-linenumber="1025"><td class="num" id="LN1025">1025</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1026"><td class="num" id="LN1026">1026</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1027"><td class="num" id="LN1027">1027</td><td class="line"> <span class='keyword'>switch</span> (info->distance_unit) {</td></tr> +<tr class="codeline" data-linenumber="1028"><td class="num" id="LN1028">1028</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_MILES:</td></tr> +<tr class="codeline" data-linenumber="1029"><td class="num" id="LN1029">1029</td><td class="line"> <span class='comment'>/* Translators: This is the visibility in miles */</span></td></tr> +<tr class="codeline" data-linenumber="1030"><td class="num" id="LN1030">1030</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f miles"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f miles"))</span></span>, info->visibility);</td></tr> +<tr class="codeline" data-linenumber="1031"><td class="num" id="LN1031">1031</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1032"><td class="num" id="LN1032">1032</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_KM:</td></tr> +<tr class="codeline" data-linenumber="1033"><td class="num" id="LN1033">1033</td><td class="line"> <span class='comment'>/* Translators: This is the visibility in kilometers */</span></td></tr> +<tr class="codeline" data-linenumber="1034"><td class="num" id="LN1034">1034</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f km"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f km"))</span></span>, <span class='macro'>VISIBILITY_SM_TO_KM (info->visibility)<span class='macro_popup'>((info->visibility) * 1.609344)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1035"><td class="num" id="LN1035">1035</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1036"><td class="num" id="LN1036">1036</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_METERS:</td></tr> +<tr class="codeline" data-linenumber="1037"><td class="num" id="LN1037">1037</td><td class="line"> <span class='comment'>/* Translators: This is the visibility in meters */</span></td></tr> +<tr class="codeline" data-linenumber="1038"><td class="num" id="LN1038">1038</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.0fm"</span>)<span class='macro_popup'>(mateweather_gettext ("%.0fm"))</span></span>, <span class='macro'>VISIBILITY_SM_TO_M (info->visibility)<span class='macro_popup'>(((info->visibility) * 1.609344) * 1000)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1039"><td class="num" id="LN1039">1039</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1040"><td class="num" id="LN1040">1040</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1041"><td class="num" id="LN1041">1041</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1042"><td class="num" id="LN1042">1042</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1043"><td class="num" id="LN1043">1043</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1044"><td class="num" id="LN1044">1044</td><td class="line"> g_warning (<span class='string_literal'>"Conversion to illegal visibility unit: %d"</span>, info->pressure_unit);</td></tr> +<tr class="codeline" data-linenumber="1045"><td class="num" id="LN1045">1045</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1046"><td class="num" id="LN1046">1046</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1047"><td class="num" id="LN1047">1047</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1048"><td class="num" id="LN1048">1048</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="1049"><td class="num" id="LN1049">1049</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1050"><td class="num" id="LN1050">1050</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1051"><td class="num" id="LN1051">1051</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1052"><td class="num" id="LN1052">1052</td><td class="line">weather_info_get_sunrise (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1053"><td class="num" id="LN1053">1053</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1054"><td class="num" id="LN1054">1054</td><td class="line"> <span class='keyword'>static</span> gchar buf[200];</td></tr> +<tr class="codeline" data-linenumber="1055"><td class="num" id="LN1055">1055</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="1056"><td class="num" id="LN1056">1056</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1057"><td class="num" id="LN1057">1057</td><td class="line"> <span class='macro'>g_return_val_if_fail (info && info->location, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_104<br>; if (info && info->location) _g_boolean_var_104 =<br> 1; else _g_boolean_var_104 = 0; _g_boolean_var_104; }), 1)))<br> { } else { g_return_if_fail_warning ("MateWeather", ((const char<br>*) (__func__)), "info && info->location"); return (<br>((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1058"><td class="num" id="LN1058">1058</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1059"><td class="num" id="LN1059">1059</td><td class="line"> <span class='keyword'>if</span> (!info->location->latlon_valid)</td></tr> +<tr class="codeline" data-linenumber="1060"><td class="num" id="LN1060">1060</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1061"><td class="num" id="LN1061">1061</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1062"><td class="num" id="LN1062">1062</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1063"><td class="num" id="LN1063">1063</td><td class="line"> <span class='keyword'>if</span> (!calc_sun (info))</td></tr> +<tr class="codeline" data-linenumber="1064"><td class="num" id="LN1064">1064</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1065"><td class="num" id="LN1065">1065</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1066"><td class="num" id="LN1066">1066</td><td class="line"> localtime_r (&info->sunrise, &tm);</td></tr> +<tr class="codeline" data-linenumber="1067"><td class="num" id="LN1067">1067</td><td class="line"> <span class='keyword'>if</span> (strftime (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%H:%M"</span>)<span class='macro_popup'>(mateweather_gettext ("%H:%M"))</span></span>, &tm) <= 0)</td></tr> +<tr class="codeline" data-linenumber="1068"><td class="num" id="LN1068">1068</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1069"><td class="num" id="LN1069">1069</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="1070"><td class="num" id="LN1070">1070</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1071"><td class="num" id="LN1071">1071</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1072"><td class="num" id="LN1072">1072</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1073"><td class="num" id="LN1073">1073</td><td class="line">weather_info_get_sunset (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1074"><td class="num" id="LN1074">1074</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1075"><td class="num" id="LN1075">1075</td><td class="line"> <span class='keyword'>static</span> gchar buf[200];</td></tr> +<tr class="codeline" data-linenumber="1076"><td class="num" id="LN1076">1076</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="1077"><td class="num" id="LN1077">1077</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1078"><td class="num" id="LN1078">1078</td><td class="line"> <span class='macro'>g_return_val_if_fail (info && info->location, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_105<br>; if (info && info->location) _g_boolean_var_105 =<br> 1; else _g_boolean_var_105 = 0; _g_boolean_var_105; }), 1)))<br> { } else { g_return_if_fail_warning ("MateWeather", ((const char<br>*) (__func__)), "info && info->location"); return (<br>((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1079"><td class="num" id="LN1079">1079</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1080"><td class="num" id="LN1080">1080</td><td class="line"> <span class='keyword'>if</span> (!info->location->latlon_valid)</td></tr> +<tr class="codeline" data-linenumber="1081"><td class="num" id="LN1081">1081</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1082"><td class="num" id="LN1082">1082</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1083"><td class="num" id="LN1083">1083</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1084"><td class="num" id="LN1084">1084</td><td class="line"> <span class='keyword'>if</span> (!calc_sun (info))</td></tr> +<tr class="codeline" data-linenumber="1085"><td class="num" id="LN1085">1085</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1086"><td class="num" id="LN1086">1086</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1087"><td class="num" id="LN1087">1087</td><td class="line"> localtime_r (&info->sunset, &tm);</td></tr> +<tr class="codeline" data-linenumber="1088"><td class="num" id="LN1088">1088</td><td class="line"> <span class='keyword'>if</span> (strftime (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%H:%M"</span>)<span class='macro_popup'>(mateweather_gettext ("%H:%M"))</span></span>, &tm) <= 0)</td></tr> +<tr class="codeline" data-linenumber="1089"><td class="num" id="LN1089">1089</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1090"><td class="num" id="LN1090">1090</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="1091"><td class="num" id="LN1091">1091</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1092"><td class="num" id="LN1092">1092</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1093"><td class="num" id="LN1093">1093</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1094"><td class="num" id="LN1094">1094</td><td class="line">weather_info_get_forecast (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1095"><td class="num" id="LN1095">1095</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1096"><td class="num" id="LN1096">1096</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_106<br>; if (info != ((void*)0)) _g_boolean_var_106 = 1; else _g_boolean_var_106<br> = 0; _g_boolean_var_106; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1097"><td class="num" id="LN1097">1097</td><td class="line"> <span class='keyword'>return</span> info->forecast;</td></tr> +<tr class="codeline" data-linenumber="1098"><td class="num" id="LN1098">1098</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1099"><td class="num" id="LN1099">1099</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1100"><td class="num" id="LN1100">1100</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="1101"><td class="num" id="LN1101">1101</td><td class="line"> <span class='comment'>* weather_info_get_forecast_list:</span></td></tr> +<tr class="codeline" data-linenumber="1102"><td class="num" id="LN1102">1102</td><td class="line"> <span class='comment'>* Returns list of WeatherInfo* objects for the forecast.</span></td></tr> +<tr class="codeline" data-linenumber="1103"><td class="num" id="LN1103">1103</td><td class="line"> <span class='comment'>* The list is owned by the 'info' object thus is alive as long</span></td></tr> +<tr class="codeline" data-linenumber="1104"><td class="num" id="LN1104">1104</td><td class="line"> <span class='comment'>* as the 'info'. This list is filled only when requested with</span></td></tr> +<tr class="codeline" data-linenumber="1105"><td class="num" id="LN1105">1105</td><td class="line"> <span class='comment'>* type FORECAST_LIST and if available for given location.</span></td></tr> +<tr class="codeline" data-linenumber="1106"><td class="num" id="LN1106">1106</td><td class="line"> <span class='comment'>* The 'update' property is the date/time when the forecast info</span></td></tr> +<tr class="codeline" data-linenumber="1107"><td class="num" id="LN1107">1107</td><td class="line"> <span class='comment'>* is used for.</span></td></tr> +<tr class="codeline" data-linenumber="1108"><td class="num" id="LN1108">1108</td><td class="line"> <span class='comment'>**/</span></td></tr> +<tr class="codeline" data-linenumber="1109"><td class="num" id="LN1109">1109</td><td class="line">GSList *</td></tr> +<tr class="codeline" data-linenumber="1110"><td class="num" id="LN1110">1110</td><td class="line">weather_info_get_forecast_list (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1111"><td class="num" id="LN1111">1111</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1112"><td class="num" id="LN1112">1112</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_107<br>; if (info != ((void*)0)) _g_boolean_var_107 = 1; else _g_boolean_var_107<br> = 0; _g_boolean_var_107; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1113"><td class="num" id="LN1113">1113</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1114"><td class="num" id="LN1114">1114</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1115"><td class="num" id="LN1115">1115</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1116"><td class="num" id="LN1116">1116</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1117"><td class="num" id="LN1117">1117</td><td class="line"> <span class='keyword'>return</span> info->forecast_list;</td></tr> +<tr class="codeline" data-linenumber="1118"><td class="num" id="LN1118">1118</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1119"><td class="num" id="LN1119">1119</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1120"><td class="num" id="LN1120">1120</td><td class="line">GdkPixbufAnimation *</td></tr> +<tr class="codeline" data-linenumber="1121"><td class="num" id="LN1121">1121</td><td class="line">weather_info_get_radar (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1122"><td class="num" id="LN1122">1122</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1123"><td class="num" id="LN1123">1123</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_108<br>; if (info != ((void*)0)) _g_boolean_var_108 = 1; else _g_boolean_var_108<br> = 0; _g_boolean_var_108; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1124"><td class="num" id="LN1124">1124</td><td class="line"> <span class='keyword'>return</span> info->radar;</td></tr> +<tr class="codeline" data-linenumber="1125"><td class="num" id="LN1125">1125</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1126"><td class="num" id="LN1126">1126</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1127"><td class="num" id="LN1127">1127</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1128"><td class="num" id="LN1128">1128</td><td class="line">weather_info_get_temp_summary (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1129"><td class="num" id="LN1129">1129</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1130"><td class="num" id="LN1130">1130</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_109<br>; if (info != ((void*)0)) _g_boolean_var_109 = 1; else _g_boolean_var_109<br> = 0; _g_boolean_var_109; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1131"><td class="num" id="LN1131">1131</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1132"><td class="num" id="LN1132">1132</td><td class="line"> <span class='keyword'>if</span> (!info->valid || info->temp < -500.0)</td></tr> +<tr class="codeline" data-linenumber="1133"><td class="num" id="LN1133">1133</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"--"</span>;</td></tr> +<tr class="codeline" data-linenumber="1134"><td class="num" id="LN1134">1134</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1135"><td class="num" id="LN1135">1135</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->temp, info->temperature_unit, <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1136"><td class="num" id="LN1136">1136</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1137"><td class="num" id="LN1137">1137</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1138"><td class="num" id="LN1138">1138</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1139"><td class="num" id="LN1139">1139</td><td class="line">gchar *</td></tr> +<tr class="codeline" data-linenumber="1140"><td class="num" id="LN1140">1140</td><td class="line">weather_info_get_weather_summary (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1141"><td class="num" id="LN1141">1141</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1142"><td class="num" id="LN1142">1142</td><td class="line"> <span class='keyword'>const</span> gchar *buf;</td></tr> +<tr class="codeline" data-linenumber="1143"><td class="num" id="LN1143">1143</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1144"><td class="num" id="LN1144">1144</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_110<br>; if (info != ((void*)0)) _g_boolean_var_110 = 1; else _g_boolean_var_110<br> = 0; _g_boolean_var_110; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1145"><td class="num" id="LN1145">1145</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1146"><td class="num" id="LN1146">1146</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1147"><td class="num" id="LN1147">1147</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>g_strdup (_(<span class='string_literal'>"Retrieval failed"</span>))<span class='macro_popup'>g_strdup_inline ((mateweather_gettext ("Retrieval failed")))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1148"><td class="num" id="LN1148">1148</td><td class="line"> buf = weather_info_get_conditions (info);</td></tr> +<tr class="codeline" data-linenumber="1149"><td class="num" id="LN1149">1149</td><td class="line"> <span class='keyword'>if</span> (!strcmp (buf, <span class='string_literal'>"-"</span>))</td></tr> +<tr class="codeline" data-linenumber="1150"><td class="num" id="LN1150">1150</td><td class="line"> buf = weather_info_get_sky (info);</td></tr> +<tr class="codeline" data-linenumber="1151"><td class="num" id="LN1151">1151</td><td class="line"> <span class='keyword'>return</span> g_strdup_printf (<span class='string_literal'>"%s: %s"</span>, weather_info_get_location_name (info), buf);</td></tr> +<tr class="codeline" data-linenumber="1152"><td class="num" id="LN1152">1152</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1153"><td class="num" id="LN1153">1153</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1154"><td class="num" id="LN1154">1154</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1155"><td class="num" id="LN1155">1155</td><td class="line">weather_info_get_icon_name (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1156"><td class="num" id="LN1156">1156</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1157"><td class="num" id="LN1157">1157</td><td class="line"> WeatherConditions cond;</td></tr> +<tr class="codeline" data-linenumber="1158"><td class="num" id="LN1158">1158</td><td class="line"> WeatherSky sky;</td></tr> +<tr class="codeline" data-linenumber="1159"><td class="num" id="LN1159">1159</td><td class="line"> time_t current_time;</td></tr> +<tr class="codeline" data-linenumber="1160"><td class="num" id="LN1160">1160</td><td class="line"> gboolean daytime;</td></tr> +<tr class="codeline" data-linenumber="1161"><td class="num" id="LN1161">1161</td><td class="line"> gchar* icon;</td></tr> +<tr class="codeline" data-linenumber="1162"><td class="num" id="LN1162">1162</td><td class="line"> <span class='keyword'>static</span> gchar icon_buffer[32];</td></tr> +<tr class="codeline" data-linenumber="1163"><td class="num" id="LN1163">1163</td><td class="line"> WeatherMoonPhase moonPhase;</td></tr> +<tr class="codeline" data-linenumber="1164"><td class="num" id="LN1164">1164</td><td class="line"> WeatherMoonLatitude moonLat;</td></tr> +<tr class="codeline" data-linenumber="1165"><td class="num" id="LN1165">1165</td><td class="line"> gint phase;</td></tr> +<tr class="codeline" data-linenumber="1166"><td class="num" id="LN1166">1166</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1167"><td class="num" id="LN1167">1167</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_111<br>; if (info != ((void*)0)) _g_boolean_var_111 = 1; else _g_boolean_var_111<br> = 0; _g_boolean_var_111; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1168"><td class="num" id="LN1168">1168</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1169"><td class="num" id="LN1169">1169</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1170"><td class="num" id="LN1170">1170</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1171"><td class="num" id="LN1171">1171</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1172"><td class="num" id="LN1172">1172</td><td class="line"> cond = info->cond;</td></tr> +<tr class="codeline" data-linenumber="1173"><td class="num" id="LN1173">1173</td><td class="line"> sky = info->sky;</td></tr> +<tr class="codeline" data-linenumber="1174"><td class="num" id="LN1174">1174</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1175"><td class="num" id="LN1175">1175</td><td class="line"> <span class='keyword'>if</span> (cond.significant) {</td></tr> +<tr class="codeline" data-linenumber="1176"><td class="num" id="LN1176">1176</td><td class="line"> <span class='keyword'>if</span> (cond.phenomenon != PHENOMENON_NONE &&</td></tr> +<tr class="codeline" data-linenumber="1177"><td class="num" id="LN1177">1177</td><td class="line"> cond.qualifier == QUALIFIER_THUNDERSTORM)</td></tr> +<tr class="codeline" data-linenumber="1178"><td class="num" id="LN1178">1178</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-storm"</span>;</td></tr> +<tr class="codeline" data-linenumber="1179"><td class="num" id="LN1179">1179</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1180"><td class="num" id="LN1180">1180</td><td class="line"> <span class='keyword'>switch</span> (cond.phenomenon) {</td></tr> +<tr class="codeline" data-linenumber="1181"><td class="num" id="LN1181">1181</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1182"><td class="num" id="LN1182">1182</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_LAST:</td></tr> +<tr class="codeline" data-linenumber="1183"><td class="num" id="LN1183">1183</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_NONE:</td></tr> +<tr class="codeline" data-linenumber="1184"><td class="num" id="LN1184">1184</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1185"><td class="num" id="LN1185">1185</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1186"><td class="num" id="LN1186">1186</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_DRIZZLE:</td></tr> +<tr class="codeline" data-linenumber="1187"><td class="num" id="LN1187">1187</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_RAIN:</td></tr> +<tr class="codeline" data-linenumber="1188"><td class="num" id="LN1188">1188</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_UNKNOWN_PRECIPITATION:</td></tr> +<tr class="codeline" data-linenumber="1189"><td class="num" id="LN1189">1189</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_HAIL:</td></tr> +<tr class="codeline" data-linenumber="1190"><td class="num" id="LN1190">1190</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SMALL_HAIL:</td></tr> +<tr class="codeline" data-linenumber="1191"><td class="num" id="LN1191">1191</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-showers"</span>;</td></tr> +<tr class="codeline" data-linenumber="1192"><td class="num" id="LN1192">1192</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1193"><td class="num" id="LN1193">1193</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SNOW:</td></tr> +<tr class="codeline" data-linenumber="1194"><td class="num" id="LN1194">1194</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SNOW_GRAINS:</td></tr> +<tr class="codeline" data-linenumber="1195"><td class="num" id="LN1195">1195</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_ICE_PELLETS:</td></tr> +<tr class="codeline" data-linenumber="1196"><td class="num" id="LN1196">1196</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_ICE_CRYSTALS:</td></tr> +<tr class="codeline" data-linenumber="1197"><td class="num" id="LN1197">1197</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-snow"</span>;</td></tr> +<tr class="codeline" data-linenumber="1198"><td class="num" id="LN1198">1198</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1199"><td class="num" id="LN1199">1199</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_TORNADO:</td></tr> +<tr class="codeline" data-linenumber="1200"><td class="num" id="LN1200">1200</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SQUALL:</td></tr> +<tr class="codeline" data-linenumber="1201"><td class="num" id="LN1201">1201</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-storm"</span>;</td></tr> +<tr class="codeline" data-linenumber="1202"><td class="num" id="LN1202">1202</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1203"><td class="num" id="LN1203">1203</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_MIST:</td></tr> +<tr class="codeline" data-linenumber="1204"><td class="num" id="LN1204">1204</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_FOG:</td></tr> +<tr class="codeline" data-linenumber="1205"><td class="num" id="LN1205">1205</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SMOKE:</td></tr> +<tr class="codeline" data-linenumber="1206"><td class="num" id="LN1206">1206</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_VOLCANIC_ASH:</td></tr> +<tr class="codeline" data-linenumber="1207"><td class="num" id="LN1207">1207</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SAND:</td></tr> +<tr class="codeline" data-linenumber="1208"><td class="num" id="LN1208">1208</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_HAZE:</td></tr> +<tr class="codeline" data-linenumber="1209"><td class="num" id="LN1209">1209</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SPRAY:</td></tr> +<tr class="codeline" data-linenumber="1210"><td class="num" id="LN1210">1210</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_DUST:</td></tr> +<tr class="codeline" data-linenumber="1211"><td class="num" id="LN1211">1211</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SANDSTORM:</td></tr> +<tr class="codeline" data-linenumber="1212"><td class="num" id="LN1212">1212</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_DUSTSTORM:</td></tr> +<tr class="codeline" data-linenumber="1213"><td class="num" id="LN1213">1213</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_FUNNEL_CLOUD:</td></tr> +<tr class="codeline" data-linenumber="1214"><td class="num" id="LN1214">1214</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_DUST_WHIRLS:</td></tr> +<tr class="codeline" data-linenumber="1215"><td class="num" id="LN1215">1215</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-fog"</span>;</td></tr> +<tr class="codeline" data-linenumber="1216"><td class="num" id="LN1216">1216</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1217"><td class="num" id="LN1217">1217</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1218"><td class="num" id="LN1218">1218</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1219"><td class="num" id="LN1219">1219</td><td class="line"> <span class='keyword'>if</span> (info->midnightSun ||</td></tr> +<tr class="codeline" data-linenumber="1220"><td class="num" id="LN1220">1220</td><td class="line"> (!info->sunriseValid && !info->sunsetValid))</td></tr> +<tr class="codeline" data-linenumber="1221"><td class="num" id="LN1221">1221</td><td class="line"> daytime = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1222"><td class="num" id="LN1222">1222</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (info->polarNight)</td></tr> +<tr class="codeline" data-linenumber="1223"><td class="num" id="LN1223">1223</td><td class="line"> daytime = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1224"><td class="num" id="LN1224">1224</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="1225"><td class="num" id="LN1225">1225</td><td class="line"> current_time = time (<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1226"><td class="num" id="LN1226">1226</td><td class="line"> daytime =</td></tr> +<tr class="codeline" data-linenumber="1227"><td class="num" id="LN1227">1227</td><td class="line"> ( !info->sunriseValid || (current_time >= info->sunrise) ) &&</td></tr> +<tr class="codeline" data-linenumber="1228"><td class="num" id="LN1228">1228</td><td class="line"> ( !info->sunsetValid || (current_time < info->sunset) );</td></tr> +<tr class="codeline" data-linenumber="1229"><td class="num" id="LN1229">1229</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1230"><td class="num" id="LN1230">1230</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1231"><td class="num" id="LN1231">1231</td><td class="line"> <span class='keyword'>switch</span> (sky) {</td></tr> +<tr class="codeline" data-linenumber="1232"><td class="num" id="LN1232">1232</td><td class="line"> <span class='keyword'>case</span> SKY_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1233"><td class="num" id="LN1233">1233</td><td class="line"> <span class='keyword'>case</span> SKY_LAST:</td></tr> +<tr class="codeline" data-linenumber="1234"><td class="num" id="LN1234">1234</td><td class="line"> <span class='keyword'>case</span> SKY_CLEAR:</td></tr> +<tr class="codeline" data-linenumber="1235"><td class="num" id="LN1235">1235</td><td class="line"> <span class='keyword'>if</span> (daytime)</td></tr> +<tr class="codeline" data-linenumber="1236"><td class="num" id="LN1236">1236</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-clear"</span>;</td></tr> +<tr class="codeline" data-linenumber="1237"><td class="num" id="LN1237">1237</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="1238"><td class="num" id="LN1238">1238</td><td class="line"> icon = g_stpcpy(icon_buffer, <span class='string_literal'>"weather-clear-night"</span>);</td></tr> +<tr class="codeline" data-linenumber="1239"><td class="num" id="LN1239">1239</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1240"><td class="num" id="LN1240">1240</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1241"><td class="num" id="LN1241">1241</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1242"><td class="num" id="LN1242">1242</td><td class="line"> <span class='keyword'>case</span> SKY_BROKEN:</td></tr> +<tr class="codeline" data-linenumber="1243"><td class="num" id="LN1243">1243</td><td class="line"> <span class='keyword'>case</span> SKY_SCATTERED:</td></tr> +<tr class="codeline" data-linenumber="1244"><td class="num" id="LN1244">1244</td><td class="line"> <span class='keyword'>case</span> SKY_FEW:</td></tr> +<tr class="codeline" data-linenumber="1245"><td class="num" id="LN1245">1245</td><td class="line"> <span class='keyword'>if</span> (daytime)</td></tr> +<tr class="codeline" data-linenumber="1246"><td class="num" id="LN1246">1246</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-few-clouds"</span>;</td></tr> +<tr class="codeline" data-linenumber="1247"><td class="num" id="LN1247">1247</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="1248"><td class="num" id="LN1248">1248</td><td class="line"> icon = g_stpcpy(icon_buffer, <span class='string_literal'>"weather-few-clouds-night"</span>);</td></tr> +<tr class="codeline" data-linenumber="1249"><td class="num" id="LN1249">1249</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1250"><td class="num" id="LN1250">1250</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1251"><td class="num" id="LN1251">1251</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1252"><td class="num" id="LN1252">1252</td><td class="line"> <span class='keyword'>case</span> SKY_OVERCAST:</td></tr> +<tr class="codeline" data-linenumber="1253"><td class="num" id="LN1253">1253</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-overcast"</span>;</td></tr> +<tr class="codeline" data-linenumber="1254"><td class="num" id="LN1254">1254</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1255"><td class="num" id="LN1255">1255</td><td class="line"> <span class='keyword'>default</span>: <span class='comment'>/* unrecognized */</span></td></tr> +<tr class="codeline" data-linenumber="1256"><td class="num" id="LN1256">1256</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1257"><td class="num" id="LN1257">1257</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1258"><td class="num" id="LN1258">1258</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1259"><td class="num" id="LN1259">1259</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="1260"><td class="num" id="LN1260">1260</td><td class="line"> <span class='comment'>* A phase-of-moon icon is to be returned.</span></td></tr> +<tr class="codeline" data-linenumber="1261"><td class="num" id="LN1261">1261</td><td class="line"> <span class='comment'>* Determine which one based on the moon's location</span></td></tr> +<tr class="codeline" data-linenumber="1262"><td class="num" id="LN1262">1262</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="1263"><td class="num" id="LN1263">1263</td><td class="line"> <span class='keyword'>if</span> (info->moonValid && weather_info_get_value_moonphase(info, &moonPhase, &moonLat)) {</td></tr> +<tr class="codeline" data-linenumber="1264"><td class="num" id="LN1264">1264</td><td class="line"> phase = (gint)((moonPhase * <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span> / 360.) + 0.5);</td></tr> +<tr class="codeline" data-linenumber="1265"><td class="num" id="LN1265">1265</td><td class="line"> <span class='keyword'>if</span> (phase == <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="1266"><td class="num" id="LN1266">1266</td><td class="line"> phase = 0;</td></tr> +<tr class="codeline" data-linenumber="1267"><td class="num" id="LN1267">1267</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (phase > 0 &&</td></tr> +<tr class="codeline" data-linenumber="1268"><td class="num" id="LN1268">1268</td><td class="line"> (<span class='macro'>RADIANS_TO_DEGREES(weather_info_get_location(info)->latitude)<span class='macro_popup'>((weather_info_get_location(info)->latitude) * 180. / 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="1269"><td class="num" id="LN1269">1269</td><td class="line"> < moonLat)) {</td></tr> +<tr class="codeline" data-linenumber="1270"><td class="num" id="LN1270">1270</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="1271"><td class="num" id="LN1271">1271</td><td class="line"> <span class='comment'>* Locations south of the moon's latitude will see the moon in the</span></td></tr> +<tr class="codeline" data-linenumber="1272"><td class="num" id="LN1272">1272</td><td class="line"> <span class='comment'>* northern sky. The moon waxes and wanes from left to right</span></td></tr> +<tr class="codeline" data-linenumber="1273"><td class="num" id="LN1273">1273</td><td class="line"> <span class='comment'>* so we reference an icon running in the opposite direction.</span></td></tr> +<tr class="codeline" data-linenumber="1274"><td class="num" id="LN1274">1274</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="1275"><td class="num" id="LN1275">1275</td><td class="line"> phase = <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span> - phase;</td></tr> +<tr class="codeline" data-linenumber="1276"><td class="num" id="LN1276">1276</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1277"><td class="num" id="LN1277">1277</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1278"><td class="num" id="LN1278">1278</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="1279"><td class="num" id="LN1279">1279</td><td class="line"> <span class='comment'>* If the moon is not full then append the angle to the icon string.</span></td></tr> +<tr class="codeline" data-linenumber="1280"><td class="num" id="LN1280">1280</td><td class="line"> <span class='comment'>* Note that an icon by this name is not required to exist:</span></td></tr> +<tr class="codeline" data-linenumber="1281"><td class="num" id="LN1281">1281</td><td class="line"> <span class='comment'>* the caller can use GTK_ICON_LOOKUP_GENERIC_FALLBACK to fall back to</span></td></tr> +<tr class="codeline" data-linenumber="1282"><td class="num" id="LN1282">1282</td><td class="line"> <span class='comment'>* the full moon image.</span></td></tr> +<tr class="codeline" data-linenumber="1283"><td class="num" id="LN1283">1283</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="1284"><td class="num" id="LN1284">1284</td><td class="line"> <span class='keyword'>if</span> ((0 == (<span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span> & 0x1)) && (<span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span>/2 != phase)) {</td></tr> +<tr class="codeline" data-linenumber="1285"><td class="num" id="LN1285">1285</td><td class="line"> g_snprintf(icon, <span class='keyword'>sizeof</span>(icon_buffer) - strlen(icon_buffer),</td></tr> +<tr class="codeline" data-linenumber="1286"><td class="num" id="LN1286">1286</td><td class="line"> <span class='string_literal'>"-%03d"</span>, phase * 360 / <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1287"><td class="num" id="LN1287">1287</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1288"><td class="num" id="LN1288">1288</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1289"><td class="num" id="LN1289">1289</td><td class="line"> <span class='keyword'>return</span> icon_buffer;</td></tr> +<tr class="codeline" data-linenumber="1290"><td class="num" id="LN1290">1290</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1291"><td class="num" id="LN1291">1291</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1292"><td class="num" id="LN1292">1292</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="1293"><td class="num" id="LN1293">1293</td><td class="line">temperature_value (gdouble temp_f,</td></tr> +<tr class="codeline" data-linenumber="1294"><td class="num" id="LN1294">1294</td><td class="line"> TempUnit to_unit,</td></tr> +<tr class="codeline" data-linenumber="1295"><td class="num" id="LN1295">1295</td><td class="line"> gdouble *value,</td></tr> +<tr class="codeline" data-linenumber="1296"><td class="num" id="LN1296">1296</td><td class="line"> TempUnit def_unit)</td></tr> +<tr class="codeline" data-linenumber="1297"><td class="num" id="LN1297">1297</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1298"><td class="num" id="LN1298">1298</td><td class="line"> gboolean ok = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1299"><td class="num" id="LN1299">1299</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1300"><td class="num" id="LN1300">1300</td><td class="line"> *value = 0.0;</td></tr> +<tr class="codeline" data-linenumber="1301"><td class="num" id="LN1301">1301</td><td class="line"> <span class='keyword'>if</span> (temp_f < -500.0)</td></tr> +<tr class="codeline" data-linenumber="1302"><td class="num" id="LN1302">1302</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1303"><td class="num" id="LN1303">1303</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1304"><td class="num" id="LN1304">1304</td><td class="line"> <span class='keyword'>if</span> (to_unit == TEMP_UNIT_DEFAULT)</td></tr> +<tr class="codeline" data-linenumber="1305"><td class="num" id="LN1305">1305</td><td class="line"> to_unit = def_unit;</td></tr> +<tr class="codeline" data-linenumber="1306"><td class="num" id="LN1306">1306</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1307"><td class="num" id="LN1307">1307</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="1308"><td class="num" id="LN1308">1308</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_FAHRENHEIT:</td></tr> +<tr class="codeline" data-linenumber="1309"><td class="num" id="LN1309">1309</td><td class="line"> *value = temp_f;</td></tr> +<tr class="codeline" data-linenumber="1310"><td class="num" id="LN1310">1310</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1311"><td class="num" id="LN1311">1311</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_CENTIGRADE:</td></tr> +<tr class="codeline" data-linenumber="1312"><td class="num" id="LN1312">1312</td><td class="line"> *value = <span class='macro'>TEMP_F_TO_C (temp_f)<span class='macro_popup'>(((temp_f) - 32.0) * (5.0/9.0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1313"><td class="num" id="LN1313">1313</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1314"><td class="num" id="LN1314">1314</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_KELVIN:</td></tr> +<tr class="codeline" data-linenumber="1315"><td class="num" id="LN1315">1315</td><td class="line"> *value = <span class='macro'>TEMP_F_TO_K (temp_f)<span class='macro_popup'>((temp_f + 459.67) * (5.0/9.0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1316"><td class="num" id="LN1316">1316</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1317"><td class="num" id="LN1317">1317</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1318"><td class="num" id="LN1318">1318</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1319"><td class="num" id="LN1319">1319</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1320"><td class="num" id="LN1320">1320</td><td class="line"> ok = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1321"><td class="num" id="LN1321">1321</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1322"><td class="num" id="LN1322">1322</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1323"><td class="num" id="LN1323">1323</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1324"><td class="num" id="LN1324">1324</td><td class="line"> <span class='keyword'>return</span> ok;</td></tr> +<tr class="codeline" data-linenumber="1325"><td class="num" id="LN1325">1325</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1326"><td class="num" id="LN1326">1326</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1327"><td class="num" id="LN1327">1327</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="1328"><td class="num" id="LN1328">1328</td><td class="line">speed_value (gdouble knots, SpeedUnit to_unit, gdouble *value, SpeedUnit def_unit)</td></tr> +<tr class="codeline" data-linenumber="1329"><td class="num" id="LN1329">1329</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1330"><td class="num" id="LN1330">1330</td><td class="line"> gboolean ok = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1331"><td class="num" id="LN1331">1331</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1332"><td class="num" id="LN1332">1332</td><td class="line"> *value = -1.0;</td></tr> +<tr class="codeline" data-linenumber="1333"><td class="num" id="LN1333">1333</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1334"><td class="num" id="LN1334">1334</td><td class="line"> <span class='keyword'>if</span> (knots < 0.0)</td></tr> +<tr class="codeline" data-linenumber="1335"><td class="num" id="LN1335">1335</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1336"><td class="num" id="LN1336">1336</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1337"><td class="num" id="LN1337">1337</td><td class="line"> <span class='keyword'>if</span> (to_unit == SPEED_UNIT_DEFAULT)</td></tr> +<tr class="codeline" data-linenumber="1338"><td class="num" id="LN1338">1338</td><td class="line"> to_unit = def_unit;</td></tr> +<tr class="codeline" data-linenumber="1339"><td class="num" id="LN1339">1339</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1340"><td class="num" id="LN1340">1340</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="1341"><td class="num" id="LN1341">1341</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_KNOTS:</td></tr> +<tr class="codeline" data-linenumber="1342"><td class="num" id="LN1342">1342</td><td class="line"> *value = knots;</td></tr> +<tr class="codeline" data-linenumber="1343"><td class="num" id="LN1343">1343</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1344"><td class="num" id="LN1344">1344</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_MPH:</td></tr> +<tr class="codeline" data-linenumber="1345"><td class="num" id="LN1345">1345</td><td class="line"> *value = <span class='macro'>WINDSPEED_KNOTS_TO_MPH (knots)<span class='macro_popup'>((knots) * 1.150779)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1346"><td class="num" id="LN1346">1346</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1347"><td class="num" id="LN1347">1347</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_KPH:</td></tr> +<tr class="codeline" data-linenumber="1348"><td class="num" id="LN1348">1348</td><td class="line"> *value = <span class='macro'>WINDSPEED_KNOTS_TO_KPH (knots)<span class='macro_popup'>((knots) * 1.851965)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1349"><td class="num" id="LN1349">1349</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1350"><td class="num" id="LN1350">1350</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_MS:</td></tr> +<tr class="codeline" data-linenumber="1351"><td class="num" id="LN1351">1351</td><td class="line"> *value = <span class='macro'>WINDSPEED_KNOTS_TO_MS (knots)<span class='macro_popup'>((knots) * 0.514444)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1352"><td class="num" id="LN1352">1352</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1353"><td class="num" id="LN1353">1353</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_BFT:</td></tr> +<tr class="codeline" data-linenumber="1354"><td class="num" id="LN1354">1354</td><td class="line"> *value = <span class='macro'>WINDSPEED_KNOTS_TO_BFT (knots)<span class='macro_popup'>(pow ((knots) * 0.615363, 0.666666))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1355"><td class="num" id="LN1355">1355</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1356"><td class="num" id="LN1356">1356</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1357"><td class="num" id="LN1357">1357</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1358"><td class="num" id="LN1358">1358</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1359"><td class="num" id="LN1359">1359</td><td class="line"> ok = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1360"><td class="num" id="LN1360">1360</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1361"><td class="num" id="LN1361">1361</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1362"><td class="num" id="LN1362">1362</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1363"><td class="num" id="LN1363">1363</td><td class="line"> <span class='keyword'>return</span> ok;</td></tr> +<tr class="codeline" data-linenumber="1364"><td class="num" id="LN1364">1364</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1365"><td class="num" id="LN1365">1365</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1366"><td class="num" id="LN1366">1366</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="1367"><td class="num" id="LN1367">1367</td><td class="line">pressure_value (gdouble inHg, PressureUnit to_unit, gdouble *value, PressureUnit def_unit)</td></tr> +<tr class="codeline" data-linenumber="1368"><td class="num" id="LN1368">1368</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1369"><td class="num" id="LN1369">1369</td><td class="line"> gboolean ok = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1370"><td class="num" id="LN1370">1370</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1371"><td class="num" id="LN1371">1371</td><td class="line"> *value = -1.0;</td></tr> +<tr class="codeline" data-linenumber="1372"><td class="num" id="LN1372">1372</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1373"><td class="num" id="LN1373">1373</td><td class="line"> <span class='keyword'>if</span> (inHg < 0.0)</td></tr> +<tr class="codeline" data-linenumber="1374"><td class="num" id="LN1374">1374</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1375"><td class="num" id="LN1375">1375</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1376"><td class="num" id="LN1376">1376</td><td class="line"> <span class='keyword'>if</span> (to_unit == PRESSURE_UNIT_DEFAULT)</td></tr> +<tr class="codeline" data-linenumber="1377"><td class="num" id="LN1377">1377</td><td class="line"> to_unit = def_unit;</td></tr> +<tr class="codeline" data-linenumber="1378"><td class="num" id="LN1378">1378</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1379"><td class="num" id="LN1379">1379</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="1380"><td class="num" id="LN1380">1380</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_INCH_HG:</td></tr> +<tr class="codeline" data-linenumber="1381"><td class="num" id="LN1381">1381</td><td class="line"> *value = inHg;</td></tr> +<tr class="codeline" data-linenumber="1382"><td class="num" id="LN1382">1382</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1383"><td class="num" id="LN1383">1383</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_MM_HG:</td></tr> +<tr class="codeline" data-linenumber="1384"><td class="num" id="LN1384">1384</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_MM (inHg)<span class='macro_popup'>((inHg) * 25.40005)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1385"><td class="num" id="LN1385">1385</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1386"><td class="num" id="LN1386">1386</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_KPA:</td></tr> +<tr class="codeline" data-linenumber="1387"><td class="num" id="LN1387">1387</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_KPA (inHg)<span class='macro_popup'>((inHg) * 3.386)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1388"><td class="num" id="LN1388">1388</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1389"><td class="num" id="LN1389">1389</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_HPA:</td></tr> +<tr class="codeline" data-linenumber="1390"><td class="num" id="LN1390">1390</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_HPA (inHg)<span class='macro_popup'>((inHg) * 33.86)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1391"><td class="num" id="LN1391">1391</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1392"><td class="num" id="LN1392">1392</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_MB:</td></tr> +<tr class="codeline" data-linenumber="1393"><td class="num" id="LN1393">1393</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_MB (inHg)<span class='macro_popup'>(((inHg) * 33.86))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1394"><td class="num" id="LN1394">1394</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1395"><td class="num" id="LN1395">1395</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_ATM:</td></tr> +<tr class="codeline" data-linenumber="1396"><td class="num" id="LN1396">1396</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_ATM (inHg)<span class='macro_popup'>((inHg) * 0.033421052)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1397"><td class="num" id="LN1397">1397</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1398"><td class="num" id="LN1398">1398</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1399"><td class="num" id="LN1399">1399</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1400"><td class="num" id="LN1400">1400</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1401"><td class="num" id="LN1401">1401</td><td class="line"> ok = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1402"><td class="num" id="LN1402">1402</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1403"><td class="num" id="LN1403">1403</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1404"><td class="num" id="LN1404">1404</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1405"><td class="num" id="LN1405">1405</td><td class="line"> <span class='keyword'>return</span> ok;</td></tr> +<tr class="codeline" data-linenumber="1406"><td class="num" id="LN1406">1406</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1407"><td class="num" id="LN1407">1407</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1408"><td class="num" id="LN1408">1408</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="1409"><td class="num" id="LN1409">1409</td><td class="line">distance_value (gdouble miles, DistanceUnit to_unit, gdouble *value, DistanceUnit def_unit)</td></tr> +<tr class="codeline" data-linenumber="1410"><td class="num" id="LN1410">1410</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1411"><td class="num" id="LN1411">1411</td><td class="line"> gboolean ok = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1412"><td class="num" id="LN1412">1412</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1413"><td class="num" id="LN1413">1413</td><td class="line"> *value = -1.0;</td></tr> +<tr class="codeline" data-linenumber="1414"><td class="num" id="LN1414">1414</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1415"><td class="num" id="LN1415">1415</td><td class="line"> <span class='keyword'>if</span> (miles < 0.0)</td></tr> +<tr class="codeline" data-linenumber="1416"><td class="num" id="LN1416">1416</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1417"><td class="num" id="LN1417">1417</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1418"><td class="num" id="LN1418">1418</td><td class="line"> <span class='keyword'>if</span> (to_unit == DISTANCE_UNIT_DEFAULT)</td></tr> +<tr class="codeline" data-linenumber="1419"><td class="num" id="LN1419">1419</td><td class="line"> to_unit = def_unit;</td></tr> +<tr class="codeline" data-linenumber="1420"><td class="num" id="LN1420">1420</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1421"><td class="num" id="LN1421">1421</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="1422"><td class="num" id="LN1422">1422</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_MILES:</td></tr> +<tr class="codeline" data-linenumber="1423"><td class="num" id="LN1423">1423</td><td class="line"> *value = miles;</td></tr> +<tr class="codeline" data-linenumber="1424"><td class="num" id="LN1424">1424</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1425"><td class="num" id="LN1425">1425</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_KM:</td></tr> +<tr class="codeline" data-linenumber="1426"><td class="num" id="LN1426">1426</td><td class="line"> *value = <span class='macro'>VISIBILITY_SM_TO_KM (miles)<span class='macro_popup'>((miles) * 1.609344)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1427"><td class="num" id="LN1427">1427</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1428"><td class="num" id="LN1428">1428</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_METERS:</td></tr> +<tr class="codeline" data-linenumber="1429"><td class="num" id="LN1429">1429</td><td class="line"> *value = <span class='macro'>VISIBILITY_SM_TO_M (miles)<span class='macro_popup'>(((miles) * 1.609344) * 1000)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1430"><td class="num" id="LN1430">1430</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1431"><td class="num" id="LN1431">1431</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1432"><td class="num" id="LN1432">1432</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1433"><td class="num" id="LN1433">1433</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1434"><td class="num" id="LN1434">1434</td><td class="line"> ok = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1435"><td class="num" id="LN1435">1435</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1436"><td class="num" id="LN1436">1436</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1437"><td class="num" id="LN1437">1437</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1438"><td class="num" id="LN1438">1438</td><td class="line"> <span class='keyword'>return</span> ok;</td></tr> +<tr class="codeline" data-linenumber="1439"><td class="num" id="LN1439">1439</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1440"><td class="num" id="LN1440">1440</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1441"><td class="num" id="LN1441">1441</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1442"><td class="num" id="LN1442">1442</td><td class="line">weather_info_get_value_sky (WeatherInfo *info, WeatherSky *sky)</td></tr> +<tr class="codeline" data-linenumber="1443"><td class="num" id="LN1443">1443</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1444"><td class="num" id="LN1444">1444</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_112<br>; if (info != ((void*)0)) _g_boolean_var_112 = 1; else _g_boolean_var_112<br> = 0; _g_boolean_var_112; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1445"><td class="num" id="LN1445">1445</td><td class="line"> <span class='macro'>g_return_val_if_fail (sky != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_113<br>; if (sky != ((void*)0)) _g_boolean_var_113 = 1; else _g_boolean_var_113<br> = 0; _g_boolean_var_113; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "sky != NULL"); return<br> ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1446"><td class="num" id="LN1446">1446</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1447"><td class="num" id="LN1447">1447</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1448"><td class="num" id="LN1448">1448</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1449"><td class="num" id="LN1449">1449</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1450"><td class="num" id="LN1450">1450</td><td class="line"> <span class='keyword'>if</span> (info->sky <= SKY_INVALID || info->sky >= SKY_LAST)</td></tr> +<tr class="codeline" data-linenumber="1451"><td class="num" id="LN1451">1451</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1452"><td class="num" id="LN1452">1452</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1453"><td class="num" id="LN1453">1453</td><td class="line"> *sky = info->sky;</td></tr> +<tr class="codeline" data-linenumber="1454"><td class="num" id="LN1454">1454</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1455"><td class="num" id="LN1455">1455</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1456"><td class="num" id="LN1456">1456</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1457"><td class="num" id="LN1457">1457</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1458"><td class="num" id="LN1458">1458</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1459"><td class="num" id="LN1459">1459</td><td class="line">weather_info_get_value_conditions (WeatherInfo *info, WeatherConditionPhenomenon *phenomenon, WeatherConditionQualifier *qualifier)</td></tr> +<tr class="codeline" data-linenumber="1460"><td class="num" id="LN1460">1460</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1461"><td class="num" id="LN1461">1461</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_114<br>; if (info != ((void*)0)) _g_boolean_var_114 = 1; else _g_boolean_var_114<br> = 0; _g_boolean_var_114; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1462"><td class="num" id="LN1462">1462</td><td class="line"> <span class='macro'>g_return_val_if_fail (phenomenon != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_115<br>; if (phenomenon != ((void*)0)) _g_boolean_var_115 = 1; else _g_boolean_var_115<br> = 0; _g_boolean_var_115; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "phenomenon != NULL"<br>); return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1463"><td class="num" id="LN1463">1463</td><td class="line"> <span class='macro'>g_return_val_if_fail (qualifier != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_116<br>; if (qualifier != ((void*)0)) _g_boolean_var_116 = 1; else _g_boolean_var_116<br> = 0; _g_boolean_var_116; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "qualifier != NULL"<br>); return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1464"><td class="num" id="LN1464">1464</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1465"><td class="num" id="LN1465">1465</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1466"><td class="num" id="LN1466">1466</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1467"><td class="num" id="LN1467">1467</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1468"><td class="num" id="LN1468">1468</td><td class="line"> <span class='keyword'>if</span> (!info->cond.significant)</td></tr> +<tr class="codeline" data-linenumber="1469"><td class="num" id="LN1469">1469</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1470"><td class="num" id="LN1470">1470</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1471"><td class="num" id="LN1471">1471</td><td class="line"> <span class='keyword'>if</span> (!(info->cond.phenomenon > PHENOMENON_INVALID &&</td></tr> +<tr class="codeline" data-linenumber="1472"><td class="num" id="LN1472">1472</td><td class="line"> info->cond.phenomenon < PHENOMENON_LAST &&</td></tr> +<tr class="codeline" data-linenumber="1473"><td class="num" id="LN1473">1473</td><td class="line"> info->cond.qualifier > QUALIFIER_INVALID &&</td></tr> +<tr class="codeline" data-linenumber="1474"><td class="num" id="LN1474">1474</td><td class="line"> info->cond.qualifier < QUALIFIER_LAST))</td></tr> +<tr class="codeline" data-linenumber="1475"><td class="num" id="LN1475">1475</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1476"><td class="num" id="LN1476">1476</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1477"><td class="num" id="LN1477">1477</td><td class="line"> *phenomenon = info->cond.phenomenon;</td></tr> +<tr class="codeline" data-linenumber="1478"><td class="num" id="LN1478">1478</td><td class="line"> *qualifier = info->cond.qualifier;</td></tr> +<tr class="codeline" data-linenumber="1479"><td class="num" id="LN1479">1479</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1480"><td class="num" id="LN1480">1480</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1481"><td class="num" id="LN1481">1481</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1482"><td class="num" id="LN1482">1482</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1483"><td class="num" id="LN1483">1483</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1484"><td class="num" id="LN1484">1484</td><td class="line">weather_info_get_value_temp (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1485"><td class="num" id="LN1485">1485</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1486"><td class="num" id="LN1486">1486</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_117<br>; if (info != ((void*)0)) _g_boolean_var_117 = 1; else _g_boolean_var_117<br> = 0; _g_boolean_var_117; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1487"><td class="num" id="LN1487">1487</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_118<br>; if (value != ((void*)0)) _g_boolean_var_118 = 1; else _g_boolean_var_118<br> = 0; _g_boolean_var_118; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1488"><td class="num" id="LN1488">1488</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1489"><td class="num" id="LN1489">1489</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1490"><td class="num" id="LN1490">1490</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1491"><td class="num" id="LN1491">1491</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1492"><td class="num" id="LN1492">1492</td><td class="line"> <span class='keyword'>return</span> temperature_value (info->temp, unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1493"><td class="num" id="LN1493">1493</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1494"><td class="num" id="LN1494">1494</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1495"><td class="num" id="LN1495">1495</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1496"><td class="num" id="LN1496">1496</td><td class="line">weather_info_get_value_temp_min (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1497"><td class="num" id="LN1497">1497</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1498"><td class="num" id="LN1498">1498</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_119<br>; if (info != ((void*)0)) _g_boolean_var_119 = 1; else _g_boolean_var_119<br> = 0; _g_boolean_var_119; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1499"><td class="num" id="LN1499">1499</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_120<br>; if (value != ((void*)0)) _g_boolean_var_120 = 1; else _g_boolean_var_120<br> = 0; _g_boolean_var_120; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1500"><td class="num" id="LN1500">1500</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1501"><td class="num" id="LN1501">1501</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->tempMinMaxValid)</td></tr> +<tr class="codeline" data-linenumber="1502"><td class="num" id="LN1502">1502</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1503"><td class="num" id="LN1503">1503</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1504"><td class="num" id="LN1504">1504</td><td class="line"> <span class='keyword'>return</span> temperature_value (info->temp_min, unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1505"><td class="num" id="LN1505">1505</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1506"><td class="num" id="LN1506">1506</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1507"><td class="num" id="LN1507">1507</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1508"><td class="num" id="LN1508">1508</td><td class="line">weather_info_get_value_temp_max (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1509"><td class="num" id="LN1509">1509</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1510"><td class="num" id="LN1510">1510</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_121<br>; if (info != ((void*)0)) _g_boolean_var_121 = 1; else _g_boolean_var_121<br> = 0; _g_boolean_var_121; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1511"><td class="num" id="LN1511">1511</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_122<br>; if (value != ((void*)0)) _g_boolean_var_122 = 1; else _g_boolean_var_122<br> = 0; _g_boolean_var_122; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1512"><td class="num" id="LN1512">1512</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1513"><td class="num" id="LN1513">1513</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->tempMinMaxValid)</td></tr> +<tr class="codeline" data-linenumber="1514"><td class="num" id="LN1514">1514</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1515"><td class="num" id="LN1515">1515</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1516"><td class="num" id="LN1516">1516</td><td class="line"> <span class='keyword'>return</span> temperature_value (info->temp_max, unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1517"><td class="num" id="LN1517">1517</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1518"><td class="num" id="LN1518">1518</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1519"><td class="num" id="LN1519">1519</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1520"><td class="num" id="LN1520">1520</td><td class="line">weather_info_get_value_dew (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1521"><td class="num" id="LN1521">1521</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1522"><td class="num" id="LN1522">1522</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_123<br>; if (info != ((void*)0)) _g_boolean_var_123 = 1; else _g_boolean_var_123<br> = 0; _g_boolean_var_123; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1523"><td class="num" id="LN1523">1523</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_124<br>; if (value != ((void*)0)) _g_boolean_var_124 = 1; else _g_boolean_var_124<br> = 0; _g_boolean_var_124; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1524"><td class="num" id="LN1524">1524</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1525"><td class="num" id="LN1525">1525</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1526"><td class="num" id="LN1526">1526</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1527"><td class="num" id="LN1527">1527</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1528"><td class="num" id="LN1528">1528</td><td class="line"> <span class='keyword'>return</span> temperature_value (info->dew, unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1529"><td class="num" id="LN1529">1529</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1530"><td class="num" id="LN1530">1530</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1531"><td class="num" id="LN1531">1531</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1532"><td class="num" id="LN1532">1532</td><td class="line">weather_info_get_value_apparent (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1533"><td class="num" id="LN1533">1533</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1534"><td class="num" id="LN1534">1534</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_125<br>; if (info != ((void*)0)) _g_boolean_var_125 = 1; else _g_boolean_var_125<br> = 0; _g_boolean_var_125; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1535"><td class="num" id="LN1535">1535</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_126<br>; if (value != ((void*)0)) _g_boolean_var_126 = 1; else _g_boolean_var_126<br> = 0; _g_boolean_var_126; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1536"><td class="num" id="LN1536">1536</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1537"><td class="num" id="LN1537">1537</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1538"><td class="num" id="LN1538">1538</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1539"><td class="num" id="LN1539">1539</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1540"><td class="num" id="LN1540">1540</td><td class="line"> <span class='keyword'>return</span> temperature_value (calc_apparent (info), unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1541"><td class="num" id="LN1541">1541</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1542"><td class="num" id="LN1542">1542</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1543"><td class="num" id="LN1543">1543</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1544"><td class="num" id="LN1544">1544</td><td class="line">weather_info_get_value_update (WeatherInfo *info, time_t *value)</td></tr> +<tr class="codeline" data-linenumber="1545"><td class="num" id="LN1545">1545</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1546"><td class="num" id="LN1546">1546</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_127<br>; if (info != ((void*)0)) _g_boolean_var_127 = 1; else _g_boolean_var_127<br> = 0; _g_boolean_var_127; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1547"><td class="num" id="LN1547">1547</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_128<br>; if (value != ((void*)0)) _g_boolean_var_128 = 1; else _g_boolean_var_128<br> = 0; _g_boolean_var_128; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1548"><td class="num" id="LN1548">1548</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1549"><td class="num" id="LN1549">1549</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1550"><td class="num" id="LN1550">1550</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1551"><td class="num" id="LN1551">1551</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1552"><td class="num" id="LN1552">1552</td><td class="line"> *value = info->update;</td></tr> +<tr class="codeline" data-linenumber="1553"><td class="num" id="LN1553">1553</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1554"><td class="num" id="LN1554">1554</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1555"><td class="num" id="LN1555">1555</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1556"><td class="num" id="LN1556">1556</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1557"><td class="num" id="LN1557">1557</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1558"><td class="num" id="LN1558">1558</td><td class="line">weather_info_get_value_sunrise (WeatherInfo *info, time_t *value)</td></tr> +<tr class="codeline" data-linenumber="1559"><td class="num" id="LN1559">1559</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1560"><td class="num" id="LN1560">1560</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_129<br>; if (info != ((void*)0)) _g_boolean_var_129 = 1; else _g_boolean_var_129<br> = 0; _g_boolean_var_129; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1561"><td class="num" id="LN1561">1561</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_130<br>; if (value != ((void*)0)) _g_boolean_var_130 = 1; else _g_boolean_var_130<br> = 0; _g_boolean_var_130; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1562"><td class="num" id="LN1562">1562</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1563"><td class="num" id="LN1563">1563</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->sunriseValid)</td></tr> +<tr class="codeline" data-linenumber="1564"><td class="num" id="LN1564">1564</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1565"><td class="num" id="LN1565">1565</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1566"><td class="num" id="LN1566">1566</td><td class="line"> *value = info->sunrise;</td></tr> +<tr class="codeline" data-linenumber="1567"><td class="num" id="LN1567">1567</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1568"><td class="num" id="LN1568">1568</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1569"><td class="num" id="LN1569">1569</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1570"><td class="num" id="LN1570">1570</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1571"><td class="num" id="LN1571">1571</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1572"><td class="num" id="LN1572">1572</td><td class="line">weather_info_get_value_sunset (WeatherInfo *info, time_t *value)</td></tr> +<tr class="codeline" data-linenumber="1573"><td class="num" id="LN1573">1573</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1574"><td class="num" id="LN1574">1574</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_131<br>; if (info != ((void*)0)) _g_boolean_var_131 = 1; else _g_boolean_var_131<br> = 0; _g_boolean_var_131; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1575"><td class="num" id="LN1575">1575</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_132<br>; if (value != ((void*)0)) _g_boolean_var_132 = 1; else _g_boolean_var_132<br> = 0; _g_boolean_var_132; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1576"><td class="num" id="LN1576">1576</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1577"><td class="num" id="LN1577">1577</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->sunsetValid)</td></tr> +<tr class="codeline" data-linenumber="1578"><td class="num" id="LN1578">1578</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1579"><td class="num" id="LN1579">1579</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1580"><td class="num" id="LN1580">1580</td><td class="line"> *value = info->sunset;</td></tr> +<tr class="codeline" data-linenumber="1581"><td class="num" id="LN1581">1581</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1582"><td class="num" id="LN1582">1582</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1583"><td class="num" id="LN1583">1583</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1584"><td class="num" id="LN1584">1584</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1585"><td class="num" id="LN1585">1585</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1586"><td class="num" id="LN1586">1586</td><td class="line">weather_info_get_value_moonphase (WeatherInfo *info,</td></tr> +<tr class="codeline" data-linenumber="1587"><td class="num" id="LN1587">1587</td><td class="line"> WeatherMoonPhase *value,</td></tr> +<tr class="codeline" data-linenumber="1588"><td class="num" id="LN1588">1588</td><td class="line"> WeatherMoonLatitude *lat)</td></tr> +<tr class="codeline" data-linenumber="1589"><td class="num" id="LN1589">1589</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1590"><td class="num" id="LN1590">1590</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_133<br>; if (info != ((void*)0)) _g_boolean_var_133 = 1; else _g_boolean_var_133<br> = 0; _g_boolean_var_133; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1591"><td class="num" id="LN1591">1591</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_134<br>; if (value != ((void*)0)) _g_boolean_var_134 = 1; else _g_boolean_var_134<br> = 0; _g_boolean_var_134; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1592"><td class="num" id="LN1592">1592</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1593"><td class="num" id="LN1593">1593</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->moonValid)</td></tr> +<tr class="codeline" data-linenumber="1594"><td class="num" id="LN1594">1594</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1595"><td class="num" id="LN1595">1595</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1596"><td class="num" id="LN1596">1596</td><td class="line"> *value = info->moonphase;</td></tr> +<tr class="codeline" data-linenumber="1597"><td class="num" id="LN1597">1597</td><td class="line"> *lat = info->moonlatitude;</td></tr> +<tr class="codeline" data-linenumber="1598"><td class="num" id="LN1598">1598</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1599"><td class="num" id="LN1599">1599</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1600"><td class="num" id="LN1600">1600</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1601"><td class="num" id="LN1601">1601</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1602"><td class="num" id="LN1602">1602</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1603"><td class="num" id="LN1603">1603</td><td class="line">weather_info_get_value_wind (WeatherInfo *info, SpeedUnit unit, gdouble *speed, WeatherWindDirection *direction)</td></tr> +<tr class="codeline" data-linenumber="1604"><td class="num" id="LN1604">1604</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1605"><td class="num" id="LN1605">1605</td><td class="line"> gboolean res = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1606"><td class="num" id="LN1606">1606</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1607"><td class="num" id="LN1607">1607</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_135<br>; if (info != ((void*)0)) _g_boolean_var_135 = 1; else _g_boolean_var_135<br> = 0; _g_boolean_var_135; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1608"><td class="num" id="LN1608">1608</td><td class="line"> <span class='macro'>g_return_val_if_fail (speed != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_136<br>; if (speed != ((void*)0)) _g_boolean_var_136 = 1; else _g_boolean_var_136<br> = 0; _g_boolean_var_136; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "speed != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1609"><td class="num" id="LN1609">1609</td><td class="line"> <span class='macro'>g_return_val_if_fail (direction != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_137<br>; if (direction != ((void*)0)) _g_boolean_var_137 = 1; else _g_boolean_var_137<br> = 0; _g_boolean_var_137; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "direction != NULL"<br>); return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1610"><td class="num" id="LN1610">1610</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1611"><td class="num" id="LN1611">1611</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1612"><td class="num" id="LN1612">1612</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1613"><td class="num" id="LN1613">1613</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1614"><td class="num" id="LN1614">1614</td><td class="line"> <span class='keyword'>if</span> (info->windspeed < 0.0 || info->wind <= WIND_INVALID || info->wind >= WIND_LAST)</td></tr> +<tr class="codeline" data-linenumber="1615"><td class="num" id="LN1615">1615</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1616"><td class="num" id="LN1616">1616</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1617"><td class="num" id="LN1617">1617</td><td class="line"> res = speed_value (info->windspeed, unit, speed, info->speed_unit);</td></tr> +<tr class="codeline" data-linenumber="1618"><td class="num" id="LN1618">1618</td><td class="line"> *direction = info->wind;</td></tr> +<tr class="codeline" data-linenumber="1619"><td class="num" id="LN1619">1619</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1620"><td class="num" id="LN1620">1620</td><td class="line"> <span class='keyword'>return</span> res;</td></tr> +<tr class="codeline" data-linenumber="1621"><td class="num" id="LN1621">1621</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1622"><td class="num" id="LN1622">1622</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1623"><td class="num" id="LN1623">1623</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1624"><td class="num" id="LN1624">1624</td><td class="line">weather_info_get_value_pressure (WeatherInfo *info, PressureUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1625"><td class="num" id="LN1625">1625</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1626"><td class="num" id="LN1626">1626</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_138<br>; if (info != ((void*)0)) _g_boolean_var_138 = 1; else _g_boolean_var_138<br> = 0; _g_boolean_var_138; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1627"><td class="num" id="LN1627">1627</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_139<br>; if (value != ((void*)0)) _g_boolean_var_139 = 1; else _g_boolean_var_139<br> = 0; _g_boolean_var_139; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1628"><td class="num" id="LN1628">1628</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1629"><td class="num" id="LN1629">1629</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1630"><td class="num" id="LN1630">1630</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1631"><td class="num" id="LN1631">1631</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1632"><td class="num" id="LN1632">1632</td><td class="line"> <span class='keyword'>return</span> pressure_value (info->pressure, unit, value, info->pressure_unit);</td></tr> +<tr class="codeline" data-linenumber="1633"><td class="num" id="LN1633">1633</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1634"><td class="num" id="LN1634">1634</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1635"><td class="num" id="LN1635">1635</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1636"><td class="num" id="LN1636">1636</td><td class="line">weather_info_get_value_visibility (WeatherInfo *info, DistanceUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1637"><td class="num" id="LN1637">1637</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1638"><td class="num" id="LN1638">1638</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_140<br>; if (info != ((void*)0)) _g_boolean_var_140 = 1; else _g_boolean_var_140<br> = 0; _g_boolean_var_140; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1639"><td class="num" id="LN1639">1639</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_141<br>; if (value != ((void*)0)) _g_boolean_var_141 = 1; else _g_boolean_var_141<br> = 0; _g_boolean_var_141; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1640"><td class="num" id="LN1640">1640</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1641"><td class="num" id="LN1641">1641</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1642"><td class="num" id="LN1642">1642</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1643"><td class="num" id="LN1643">1643</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1644"><td class="num" id="LN1644">1644</td><td class="line"> <span class='keyword'>return</span> distance_value (info->visibility, unit, value, info->distance_unit);</td></tr> +<tr class="codeline" data-linenumber="1645"><td class="num" id="LN1645">1645</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1646"><td class="num" id="LN1646">1646</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1647"><td class="num" id="LN1647">1647</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="1648"><td class="num" id="LN1648">1648</td><td class="line"> <span class='comment'>* weather_info_get_upcoming_moonphases:</span></td></tr> +<tr class="codeline" data-linenumber="1649"><td class="num" id="LN1649">1649</td><td class="line"> <span class='comment'>* @info: WeatherInfo containing the time_t of interest</span></td></tr> +<tr class="codeline" data-linenumber="1650"><td class="num" id="LN1650">1650</td><td class="line"> <span class='comment'>* @phases: An array of four time_t values that will hold the returned values.</span></td></tr> +<tr class="codeline" data-linenumber="1651"><td class="num" id="LN1651">1651</td><td class="line"> <span class='comment'>* The values are estimates of the time of the next new, quarter, full and</span></td></tr> +<tr class="codeline" data-linenumber="1652"><td class="num" id="LN1652">1652</td><td class="line"> <span class='comment'>* three-quarter moons.</span></td></tr> +<tr class="codeline" data-linenumber="1653"><td class="num" id="LN1653">1653</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="1654"><td class="num" id="LN1654">1654</td><td class="line"> <span class='comment'>* Returns: gboolean indicating success or failure</span></td></tr> +<tr class="codeline" data-linenumber="1655"><td class="num" id="LN1655">1655</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="1656"><td class="num" id="LN1656">1656</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1657"><td class="num" id="LN1657">1657</td><td class="line">weather_info_get_upcoming_moonphases (WeatherInfo *info, time_t *phases)</td></tr> +<tr class="codeline" data-linenumber="1658"><td class="num" id="LN1658">1658</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1659"><td class="num" id="LN1659">1659</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_142<br>; if (info != ((void*)0)) _g_boolean_var_142 = 1; else _g_boolean_var_142<br> = 0; _g_boolean_var_142; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1660"><td class="num" id="LN1660">1660</td><td class="line"> <span class='macro'>g_return_val_if_fail (phases != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_143<br>; if (phases != ((void*)0)) _g_boolean_var_143 = 1; else _g_boolean_var_143<br> = 0; _g_boolean_var_143; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "phases != NULL"<br>); return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1661"><td class="num" id="LN1661">1661</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1662"><td class="num" id="LN1662">1662</td><td class="line"> <span class='keyword'>return</span> calc_moon_phases(info, phases);</td></tr> +<tr class="codeline" data-linenumber="1663"><td class="num" id="LN1663">1663</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1664"><td class="num" id="LN1664">1664</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1665"><td class="num" id="LN1665">1665</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="1666"><td class="num" id="LN1666">1666</td><td class="line">_weather_internal_check (<span class='keyword'>void</span>)</td></tr> +<tr class="codeline" data-linenumber="1667"><td class="num" id="LN1667">1667</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1668"><td class="num" id="LN1668">1668</td><td class="line"> <span class='macro'>g_assert (G_N_ELEMENTS (wind_direction_str) == WIND_LAST)<span class='macro_popup'>do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_144<br>; if ((sizeof (wind_direction_str) / sizeof ((wind_direction_str<br>)[0])) == WIND_LAST) _g_boolean_var_144 = 1; else _g_boolean_var_144<br> = 0; _g_boolean_var_144; }), 1)) ; else g_assertion_message_expr<br> ("MateWeather", "weather.c", 1668, ((const char*) (__func__)<br>), "G_N_ELEMENTS (wind_direction_str) == WIND_LAST"); } while<br> (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1669"><td class="num" id="LN1669">1669</td><td class="line"> <span class='macro'>g_assert (G_N_ELEMENTS (sky_str) == SKY_LAST)<span class='macro_popup'>do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_145<br>; if ((sizeof (sky_str) / sizeof ((sky_str)[0])) == SKY_LAST)<br> _g_boolean_var_145 = 1; else _g_boolean_var_145 = 0; _g_boolean_var_145<br>; }), 1)) ; else g_assertion_message_expr ("MateWeather", "weather.c"<br>, 1669, ((const char*) (__func__)), "G_N_ELEMENTS (sky_str) == SKY_LAST"<br>); } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1670"><td class="num" id="LN1670">1670</td><td class="line"> <span class='macro'>g_assert (G_N_ELEMENTS (conditions_str) == PHENOMENON_LAST)<span class='macro_popup'>do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_146<br>; if ((sizeof (conditions_str) / sizeof ((conditions_str)[0])<br>) == PHENOMENON_LAST) _g_boolean_var_146 = 1; else _g_boolean_var_146<br> = 0; _g_boolean_var_146; }), 1)) ; else g_assertion_message_expr<br> ("MateWeather", "weather.c", 1670, ((const char*) (__func__)<br>), "G_N_ELEMENTS (conditions_str) == PHENOMENON_LAST"); } while<br> (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1671"><td class="num" id="LN1671">1671</td><td class="line"> <span class='macro'>g_assert (G_N_ELEMENTS (conditions_str[0]) == QUALIFIER_LAST)<span class='macro_popup'>do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_147<br>; if ((sizeof (conditions_str[0]) / sizeof ((conditions_str[0<br>])[0])) == QUALIFIER_LAST) _g_boolean_var_147 = 1; else _g_boolean_var_147<br> = 0; _g_boolean_var_147; }), 1)) ; else g_assertion_message_expr<br> ("MateWeather", "weather.c", 1671, ((const char*) (__func__)<br>), "G_N_ELEMENTS (conditions_str[0]) == QUALIFIER_LAST"); } while<br> (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1672"><td class="num" id="LN1672">1672</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-9ba4eb.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-9ba4eb.html new file mode 100644 index 0000000..91e0c17 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-9ba4eb.html @@ -0,0 +1,1266 @@ +<!doctype html> +<html> +<head> +<title>weather-metar.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Out of bound memory access (access exceeds upper limit of memory block) --> + +<!-- BUGTYPE Out-of-bound access --> + +<!-- BUGCATEGORY Logic error --> + +<!-- BUGFILE /rootdir/libmateweather/weather-metar.c --> + +<!-- FILENAME weather-metar.c --> + +<!-- FUNCTIONNAME metar_tok_vis --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 9ba4ebf258edeab791a09e71980e85fd --> + +<!-- BUGLINE 169 --> + +<!-- BUGCOLUMN 24 --> + +<!-- BUGPATHLENGTH 9 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather-metar.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 169, column 24</a><br />Out of bound memory access (access exceeds upper limit of memory block)</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather-metar.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather-metar.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"149": 1, "150": 1, "151": 1, "152": 1, "153": 1, "154": 1, "156": 1, "158": 1, "162": 1, "164": 1, "165": 1, "166": 1, "169": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + <path class="arrow" id="arrow0"/> + <path class="arrow" id="arrow1"/> + <path class="arrow" id="arrow2"/> + <path class="arrow" id="arrow3"/> + <path class="arrow" id="arrow4"/> + <path class="arrow" id="arrow5"/> + <path class="arrow" id="arrow6"/> + <path class="arrow" id="arrow7"/> + <path class="arrow" id="arrow8"/> + <path class="arrow" id="arrow9"/> + <path class="arrow" id="arrow10"/> + <path class="arrow" id="arrow11"/> + <path class="arrow" id="arrow12"/> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 13,11,9,9,7,4,2,2,0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather-metar.c - Weather server functions (METAR)</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"><span class='directive'>#include <stdlib.h></span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"><span class='directive'>#include <string.h></span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"><span class='directive'>#include <sys/types.h></span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"><span class='directive'>#include <regex.h></span></td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#include "weather.h"</span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"><span class='keyword'>enum</span> {</td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"> TIME_RE,</td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> WIND_RE,</td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"> VIS_RE,</td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"> COND_RE,</td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> CLOUD_RE,</td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"> TEMP_RE,</td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> PRES_RE,</td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> RE_NUM</td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"><span class='comment'>/* Return time of weather report as secs since epoch UTC */</span></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line"><span class='keyword'>static</span> time_t</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line">make_time (gint utcDate, gint utcHour, gint utcMin)</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> <span class='keyword'>const</span> time_t now = time (<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> localtime_r (&now, &tm);</td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> <span class='comment'>/* If last reading took place just before midnight UTC on the</span></td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> <span class='comment'>* first, adjust the date downward to allow for the month</span></td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> <span class='comment'>* change-over. This ASSUMES that the reading won't be more than</span></td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> <span class='comment'>* 24 hrs old! */</span></td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> <span class='keyword'>if</span> ((utcDate > tm.tm_mday) && (tm.tm_mday == 1)) {</td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> tm.tm_mday = 0; <span class='comment'>/* mktime knows this is the last day of the previous</span></td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> <span class='comment'>* month. */</span></td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> tm.tm_mday = utcDate;</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> tm.tm_hour = utcHour;</td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> tm.tm_min = utcMin;</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> tm.tm_sec = 0;</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> <span class='comment'>/* mktime() assumes value is local, not UTC. Use tm_gmtoff to compensate */</span></td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_TM_TM_GMOFF<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> <span class='keyword'>return</span> tm.tm_gmtoff + mktime (&tm);</td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"><span class='directive'>#elif defined HAVE_TIMEZONE</span></td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='keyword'>return</span> timezone + mktime (&tm);</td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line">metar_tok_time (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> gint day, hr, min;</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line"> sscanf (tokp, <span class='string_literal'>"%2u%2u%2u"</span>, &day, &hr, &min);</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> info->update = make_time (day, hr, min);</td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line">metar_tok_wind (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"> gchar sdir[4], sspd[4], sgust[4];</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line"> gint dir, spd = -1;</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line"> gchar *gustp;</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> size_t glen;</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> strncpy (sdir, tokp, 3);</td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"> sdir[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> dir = (!strcmp (sdir, <span class='string_literal'>"VRB"</span>)) ? -1 : atoi (sdir);</td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> memset (sspd, 0, <span class='keyword'>sizeof</span> (sspd));</td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> glen = strspn (tokp + 3, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>);</td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"> strncpy (sspd, tokp + 3, glen);</td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line"> spd = atoi (sspd);</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> tokp += glen + 3;</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line"> gustp = strchr (tokp, 'G');</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> <span class='keyword'>if</span> (gustp) {</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> memset (sgust, 0, <span class='keyword'>sizeof</span> (sgust));</td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> glen = strspn (gustp + 1, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>);</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> strncpy (sgust, gustp + 1, glen);</td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> tokp = gustp + 1 + glen;</td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> <span class='keyword'>if</span> (!strcmp (tokp, <span class='string_literal'>"MPS"</span>))</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> info->windspeed = <span class='macro'>WINDSPEED_MS_TO_KNOTS ((WeatherWindSpeed)spd)<span class='macro_popup'>(((WeatherWindSpeed)spd) / 0.514444)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line"> info->windspeed = (WeatherWindSpeed)spd;</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"> <span class='keyword'>if</span> ((349 <= dir) || (dir <= 11))</td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line"> info->wind = WIND_N;</td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((12 <= dir) && (dir <= 33))</td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line"> info->wind = WIND_NNE;</td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((34 <= dir) && (dir <= 56))</td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line"> info->wind = WIND_NE;</td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((57 <= dir) && (dir <= 78))</td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line"> info->wind = WIND_ENE;</td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((79 <= dir) && (dir <= 101))</td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line"> info->wind = WIND_E;</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((102 <= dir) && (dir <= 123))</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line"> info->wind = WIND_ESE;</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((124 <= dir) && (dir <= 146))</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> info->wind = WIND_SE;</td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((147 <= dir) && (dir <= 168))</td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> info->wind = WIND_SSE;</td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((169 <= dir) && (dir <= 191))</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> info->wind = WIND_S;</td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((192 <= dir) && (dir <= 213))</td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> info->wind = WIND_SSW;</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((214 <= dir) && (dir <= 236))</td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> info->wind = WIND_SW;</td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((237 <= dir) && (dir <= 258))</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> info->wind = WIND_WSW;</td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((259 <= dir) && (dir <= 281))</td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> info->wind = WIND_W;</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((282 <= dir) && (dir <= 303))</td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> info->wind = WIND_WNW;</td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((304 <= dir) && (dir <= 326))</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> info->wind = WIND_NW;</td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((327 <= dir) && (dir <= 348))</td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line"> info->wind = WIND_NNW;</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line">metar_tok_vis (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> gchar *<span id="start12">pfrac</span>, *pend, *psp;</td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> gchar sval[6];</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> gint num, den, val;</td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> memset (sval, 0, <span class='keyword'>sizeof</span> (sval));</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> <span id="start11"><span id="end12"><span class='keyword'>if</span></span></span> (<span id="start10"><span class="mrange"><span id="end11">!</span></span>strcmp (tokp,<span class='string_literal'>"CAVOK"</span>)</span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path1" class="msg msgEvent" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">1</div></td><td>Assuming the condition is false</td><td><div class="PathNav"><a href="#Path2" title="Next event (2)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path2" class="msg msgControl" style="margin-left:5ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">2</div></td><td><div class="PathNav"><a href="#Path1" title="Previous event (1)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#Path3" title="Next event (3)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"> <span class='comment'>// "Ceiling And Visibility OK": visibility >= 10 KM</span></td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line"> info->visibility=10000. / <span class='macro'>VISIBILITY_SM_TO_M (1.)<span class='macro_popup'>(((1.) * 1.609344) * 1000)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> } <span class='keyword'>else</span> <span id="start9"><span id="end10"><span class='keyword'>if</span></span></span> (<span id="start8"><span class="mrange"><span id="end9">0</span></span> != (pend = strstr (tokp, <span class='string_literal'>"SM"</span>))</span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path3" class="msg msgEvent" style="margin-left:16ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">3</div></td><td><div class="PathNav"><a href="#Path2" title="Previous event (2)">←</a></div></td><td>Assuming the condition is true</td><td><div class="PathNav"><a href="#Path4" title="Next event (4)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path4" class="msg msgControl" style="margin-left:12ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">4</div></td><td><div class="PathNav"><a href="#Path3" title="Previous event (3)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path5" title="Next event (5)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"> <span class='comment'>// US observation: field ends with "SM"</span></td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line"> <span id="start5"><span id="end6"><span id="start7"><span id="end8">pfrac</span></span></span></span> = <span id="start6"><span id="end7">strchr</span></span> (tokp, '/');</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line"> <span id="start4"><span id="end5"><span class='keyword'>if</span></span></span> (<span id="start3"><span class="mrange"><span id="end4">pfrac</span></span></span>) {</td></tr> +<tr><td class="num"></td><td class="line"><div id="Path5" class="msg msgEvent" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">5</div></td><td><div class="PathNav"><a href="#Path4" title="Previous event (4)">←</a></div></td><td>Assuming 'pfrac' is non-null</td><td><div class="PathNav"><a href="#Path6" title="Next event (6)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path6" class="msg msgControl" style="margin-left:9ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">6</div></td><td><div class="PathNav"><a href="#Path5" title="Previous event (5)">←</a></div></td><td>Taking true branch</td><td><div class="PathNav"><a href="#Path7" title="Next event (7)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> <span id="start2"><span id="end3"><span class='keyword'>if</span></span></span> (<span id="start1"><span class="mrange">*</span><span id="end2">tokp</span> == 'M') {</td></tr></span> +<tr><td class="num"></td><td class="line"><div id="Path7" class="msg msgEvent" style="margin-left:17ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">7</div></td><td><div class="PathNav"><a href="#Path6" title="Previous event (6)">←</a></div></td><td>Assuming the condition is false</td><td><div class="PathNav"><a href="#Path8" title="Next event (8)">→</a></div></td></tr></table></div></td></tr> +<tr><td class="num"></td><td class="line"><div id="Path8" class="msg msgControl" style="margin-left:13ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexControl">8</div></td><td><div class="PathNav"><a href="#Path7" title="Previous event (7)">←</a></div></td><td>Taking false branch</td><td><div class="PathNav"><a href="#EndPath" title="Next event (9)">→</a></div></td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> info->visibility = 0.001;</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> <span id="start0"><span id="end1">num</span></span> = (<span class="mrange">*(<span id="end0">pfrac</span> - 1)</span> - '0');</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:24ex"><table class="msgT"><tr><td valign="top"><div class="PathIndex PathIndexEvent">9</div></td><td><div class="PathNav"><a href="#Path8" title="Previous event (8)">←</a></div></td><td>Out of bound memory access (access exceeds upper limit of memory block)</td></tr></table></div></td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> strncpy (sval, pfrac + 1, pend - pfrac - 1);</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> den = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> info->visibility =</td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> ((WeatherVisibility)num / ((WeatherVisibility)den));</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> psp = strchr (tokp, ' ');</td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> <span class='keyword'>if</span> (psp) {</td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> *psp = '\0';</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line"> val = atoi (tokp);</td></tr> +<tr class="codeline" data-linenumber="179"><td class="num" id="LN179">179</td><td class="line"> info->visibility += (WeatherVisibility)val;</td></tr> +<tr class="codeline" data-linenumber="180"><td class="num" id="LN180">180</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="181"><td class="num" id="LN181">181</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="182"><td class="num" id="LN182">182</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="183"><td class="num" id="LN183">183</td><td class="line"> strncpy (sval, tokp, pend - tokp);</td></tr> +<tr class="codeline" data-linenumber="184"><td class="num" id="LN184">184</td><td class="line"> val = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="185"><td class="num" id="LN185">185</td><td class="line"> info->visibility = (WeatherVisibility)val;</td></tr> +<tr class="codeline" data-linenumber="186"><td class="num" id="LN186">186</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="187"><td class="num" id="LN187">187</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="188"><td class="num" id="LN188">188</td><td class="line"> <span class='comment'>// International observation: NNNN(DD NNNNDD)?</span></td></tr> +<tr class="codeline" data-linenumber="189"><td class="num" id="LN189">189</td><td class="line"> <span class='comment'>// For now: use only the minimum visibility and ignore its direction</span></td></tr> +<tr class="codeline" data-linenumber="190"><td class="num" id="LN190">190</td><td class="line"> strncpy (sval, tokp, strspn (tokp, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>));</td></tr> +<tr class="codeline" data-linenumber="191"><td class="num" id="LN191">191</td><td class="line"> val = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="192"><td class="num" id="LN192">192</td><td class="line"> info->visibility = (WeatherVisibility)val / <span class='macro'>VISIBILITY_SM_TO_M (1.)<span class='macro_popup'>(((1.) * 1.609344) * 1000)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="193"><td class="num" id="LN193">193</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="194"><td class="num" id="LN194">194</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="195"><td class="num" id="LN195">195</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="196"><td class="num" id="LN196">196</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="197"><td class="num" id="LN197">197</td><td class="line">metar_tok_cloud (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="198"><td class="num" id="LN198">198</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="199"><td class="num" id="LN199">199</td><td class="line"> gchar stype[4], salt[4];</td></tr> +<tr class="codeline" data-linenumber="200"><td class="num" id="LN200">200</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="201"><td class="num" id="LN201">201</td><td class="line"> strncpy (stype, tokp, 3);</td></tr> +<tr class="codeline" data-linenumber="202"><td class="num" id="LN202">202</td><td class="line"> stype[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="203"><td class="num" id="LN203">203</td><td class="line"> <span class='keyword'>if</span> (strlen (tokp) == 6) {</td></tr> +<tr class="codeline" data-linenumber="204"><td class="num" id="LN204">204</td><td class="line"> strncpy (salt, tokp + 3, 3);</td></tr> +<tr class="codeline" data-linenumber="205"><td class="num" id="LN205">205</td><td class="line"> salt[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="206"><td class="num" id="LN206">206</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="207"><td class="num" id="LN207">207</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="208"><td class="num" id="LN208">208</td><td class="line"> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"CLR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="209"><td class="num" id="LN209">209</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="210"><td class="num" id="LN210">210</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"SKC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="211"><td class="num" id="LN211">211</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="212"><td class="num" id="LN212">212</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"NSC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="213"><td class="num" id="LN213">213</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="214"><td class="num" id="LN214">214</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"BKN"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="215"><td class="num" id="LN215">215</td><td class="line"> info->sky = SKY_BROKEN;</td></tr> +<tr class="codeline" data-linenumber="216"><td class="num" id="LN216">216</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"SCT"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="217"><td class="num" id="LN217">217</td><td class="line"> info->sky = SKY_SCATTERED;</td></tr> +<tr class="codeline" data-linenumber="218"><td class="num" id="LN218">218</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"FEW"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="219"><td class="num" id="LN219">219</td><td class="line"> info->sky = SKY_FEW;</td></tr> +<tr class="codeline" data-linenumber="220"><td class="num" id="LN220">220</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"OVC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="221"><td class="num" id="LN221">221</td><td class="line"> info->sky = SKY_OVERCAST;</td></tr> +<tr class="codeline" data-linenumber="222"><td class="num" id="LN222">222</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="223"><td class="num" id="LN223">223</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="224"><td class="num" id="LN224">224</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="225"><td class="num" id="LN225">225</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="226"><td class="num" id="LN226">226</td><td class="line">metar_tok_pres (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="227"><td class="num" id="LN227">227</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="228"><td class="num" id="LN228">228</td><td class="line"> <span class='keyword'>if</span> (*tokp == 'A') {</td></tr> +<tr class="codeline" data-linenumber="229"><td class="num" id="LN229">229</td><td class="line"> gchar sintg[3], sfract[3];</td></tr> +<tr class="codeline" data-linenumber="230"><td class="num" id="LN230">230</td><td class="line"> gint intg, fract;</td></tr> +<tr class="codeline" data-linenumber="231"><td class="num" id="LN231">231</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="232"><td class="num" id="LN232">232</td><td class="line"> strncpy (sintg, tokp + 1, 2);</td></tr> +<tr class="codeline" data-linenumber="233"><td class="num" id="LN233">233</td><td class="line"> sintg[2] = 0;</td></tr> +<tr class="codeline" data-linenumber="234"><td class="num" id="LN234">234</td><td class="line"> intg = atoi (sintg);</td></tr> +<tr class="codeline" data-linenumber="235"><td class="num" id="LN235">235</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="236"><td class="num" id="LN236">236</td><td class="line"> strncpy (sfract, tokp + 3, 2);</td></tr> +<tr class="codeline" data-linenumber="237"><td class="num" id="LN237">237</td><td class="line"> sfract[2] = 0;</td></tr> +<tr class="codeline" data-linenumber="238"><td class="num" id="LN238">238</td><td class="line"> fract = atoi (sfract);</td></tr> +<tr class="codeline" data-linenumber="239"><td class="num" id="LN239">239</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="240"><td class="num" id="LN240">240</td><td class="line"> info->pressure = (WeatherPressure)intg + (((WeatherPressure)fract)/100.0);</td></tr> +<tr class="codeline" data-linenumber="241"><td class="num" id="LN241">241</td><td class="line"> } <span class='keyword'>else</span> { <span class='comment'>/* *tokp == 'Q' */</span></td></tr> +<tr class="codeline" data-linenumber="242"><td class="num" id="LN242">242</td><td class="line"> gchar spres[5];</td></tr> +<tr class="codeline" data-linenumber="243"><td class="num" id="LN243">243</td><td class="line"> gint pres;</td></tr> +<tr class="codeline" data-linenumber="244"><td class="num" id="LN244">244</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="245"><td class="num" id="LN245">245</td><td class="line"> strncpy (spres, tokp + 1, 4);</td></tr> +<tr class="codeline" data-linenumber="246"><td class="num" id="LN246">246</td><td class="line"> spres[4] = 0;</td></tr> +<tr class="codeline" data-linenumber="247"><td class="num" id="LN247">247</td><td class="line"> pres = atoi (spres);</td></tr> +<tr class="codeline" data-linenumber="248"><td class="num" id="LN248">248</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="249"><td class="num" id="LN249">249</td><td class="line"> info->pressure = <span class='macro'>PRESSURE_MBAR_TO_INCH ((WeatherPressure)pres)<span class='macro_popup'>(((WeatherPressure)pres) * 0.029533373)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="250"><td class="num" id="LN250">250</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="251"><td class="num" id="LN251">251</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="252"><td class="num" id="LN252">252</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="253"><td class="num" id="LN253">253</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="254"><td class="num" id="LN254">254</td><td class="line">metar_tok_temp (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="255"><td class="num" id="LN255">255</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="256"><td class="num" id="LN256">256</td><td class="line"> gchar *ptemp, *pdew, *psep;</td></tr> +<tr class="codeline" data-linenumber="257"><td class="num" id="LN257">257</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="258"><td class="num" id="LN258">258</td><td class="line"> psep = strchr (tokp, '/');</td></tr> +<tr class="codeline" data-linenumber="259"><td class="num" id="LN259">259</td><td class="line"> *psep = 0;</td></tr> +<tr class="codeline" data-linenumber="260"><td class="num" id="LN260">260</td><td class="line"> ptemp = tokp;</td></tr> +<tr class="codeline" data-linenumber="261"><td class="num" id="LN261">261</td><td class="line"> pdew = psep + 1;</td></tr> +<tr class="codeline" data-linenumber="262"><td class="num" id="LN262">262</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="263"><td class="num" id="LN263">263</td><td class="line"> info->temp = (*ptemp == 'M') ? <span class='macro'>TEMP_C_TO_F (-atoi (ptemp + 1))<span class='macro_popup'>(((-atoi (ptemp + 1)) * (9.0/5.0)) + 32.0)</span></span></td></tr> +<tr class="codeline" data-linenumber="264"><td class="num" id="LN264">264</td><td class="line"> : <span class='macro'>TEMP_C_TO_F (atoi (ptemp))<span class='macro_popup'>(((atoi (ptemp)) * (9.0/5.0)) + 32.0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="265"><td class="num" id="LN265">265</td><td class="line"> <span class='keyword'>if</span> (*pdew) {</td></tr> +<tr class="codeline" data-linenumber="266"><td class="num" id="LN266">266</td><td class="line"> info->dew = (*pdew == 'M') ? <span class='macro'>TEMP_C_TO_F (-atoi (pdew + 1))<span class='macro_popup'>(((-atoi (pdew + 1)) * (9.0/5.0)) + 32.0)</span></span></td></tr> +<tr class="codeline" data-linenumber="267"><td class="num" id="LN267">267</td><td class="line"> : <span class='macro'>TEMP_C_TO_F (atoi (pdew))<span class='macro_popup'>(((atoi (pdew)) * (9.0/5.0)) + 32.0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="268"><td class="num" id="LN268">268</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="269"><td class="num" id="LN269">269</td><td class="line"> info->dew = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="270"><td class="num" id="LN270">270</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="271"><td class="num" id="LN271">271</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="272"><td class="num" id="LN272">272</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="273"><td class="num" id="LN273">273</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="274"><td class="num" id="LN274">274</td><td class="line">metar_tok_cond (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="275"><td class="num" id="LN275">275</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="276"><td class="num" id="LN276">276</td><td class="line"> gchar squal[3], sphen[4];</td></tr> +<tr class="codeline" data-linenumber="277"><td class="num" id="LN277">277</td><td class="line"> gchar *pphen;</td></tr> +<tr class="codeline" data-linenumber="278"><td class="num" id="LN278">278</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="279"><td class="num" id="LN279">279</td><td class="line"> <span class='keyword'>if</span> ((strlen (tokp) > 3) && ((*tokp == '+') || (*tokp == '-')))</td></tr> +<tr class="codeline" data-linenumber="280"><td class="num" id="LN280">280</td><td class="line"> ++tokp; <span class='comment'>/* FIX */</span></td></tr> +<tr class="codeline" data-linenumber="281"><td class="num" id="LN281">281</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="282"><td class="num" id="LN282">282</td><td class="line"> <span class='keyword'>if</span> ((*tokp == '+') || (*tokp == '-'))</td></tr> +<tr class="codeline" data-linenumber="283"><td class="num" id="LN283">283</td><td class="line"> pphen = tokp + 1;</td></tr> +<tr class="codeline" data-linenumber="284"><td class="num" id="LN284">284</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (strlen (tokp) < 4)</td></tr> +<tr class="codeline" data-linenumber="285"><td class="num" id="LN285">285</td><td class="line"> pphen = tokp;</td></tr> +<tr class="codeline" data-linenumber="286"><td class="num" id="LN286">286</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="287"><td class="num" id="LN287">287</td><td class="line"> pphen = tokp + 2;</td></tr> +<tr class="codeline" data-linenumber="288"><td class="num" id="LN288">288</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="289"><td class="num" id="LN289">289</td><td class="line"> memset (squal, 0, <span class='keyword'>sizeof</span> (squal));</td></tr> +<tr class="codeline" data-linenumber="290"><td class="num" id="LN290">290</td><td class="line"> strncpy (squal, tokp, pphen - tokp);</td></tr> +<tr class="codeline" data-linenumber="291"><td class="num" id="LN291">291</td><td class="line"> squal[pphen - tokp] = 0;</td></tr> +<tr class="codeline" data-linenumber="292"><td class="num" id="LN292">292</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="293"><td class="num" id="LN293">293</td><td class="line"> memset (sphen, 0, <span class='keyword'>sizeof</span> (sphen));</td></tr> +<tr class="codeline" data-linenumber="294"><td class="num" id="LN294">294</td><td class="line"> strncpy (sphen, pphen, <span class='keyword'>sizeof</span> (sphen));</td></tr> +<tr class="codeline" data-linenumber="295"><td class="num" id="LN295">295</td><td class="line"> sphen[<span class='keyword'>sizeof</span> (sphen)-1] = '\0';</td></tr> +<tr class="codeline" data-linenumber="296"><td class="num" id="LN296">296</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="297"><td class="num" id="LN297">297</td><td class="line"> <span class='comment'>/* Defaults */</span></td></tr> +<tr class="codeline" data-linenumber="298"><td class="num" id="LN298">298</td><td class="line"> info->cond.qualifier = QUALIFIER_NONE;</td></tr> +<tr class="codeline" data-linenumber="299"><td class="num" id="LN299">299</td><td class="line"> info->cond.phenomenon = PHENOMENON_NONE;</td></tr> +<tr class="codeline" data-linenumber="300"><td class="num" id="LN300">300</td><td class="line"> info->cond.significant = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="301"><td class="num" id="LN301">301</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="302"><td class="num" id="LN302">302</td><td class="line"> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>""</span>)) {</td></tr> +<tr class="codeline" data-linenumber="303"><td class="num" id="LN303">303</td><td class="line"> info->cond.qualifier = QUALIFIER_MODERATE;</td></tr> +<tr class="codeline" data-linenumber="304"><td class="num" id="LN304">304</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"-"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="305"><td class="num" id="LN305">305</td><td class="line"> info->cond.qualifier = QUALIFIER_LIGHT;</td></tr> +<tr class="codeline" data-linenumber="306"><td class="num" id="LN306">306</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"+"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="307"><td class="num" id="LN307">307</td><td class="line"> info->cond.qualifier = QUALIFIER_HEAVY;</td></tr> +<tr class="codeline" data-linenumber="308"><td class="num" id="LN308">308</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"VC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="309"><td class="num" id="LN309">309</td><td class="line"> info->cond.qualifier = QUALIFIER_VICINITY;</td></tr> +<tr class="codeline" data-linenumber="310"><td class="num" id="LN310">310</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"MI"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="311"><td class="num" id="LN311">311</td><td class="line"> info->cond.qualifier = QUALIFIER_SHALLOW;</td></tr> +<tr class="codeline" data-linenumber="312"><td class="num" id="LN312">312</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"BC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="313"><td class="num" id="LN313">313</td><td class="line"> info->cond.qualifier = QUALIFIER_PATCHES;</td></tr> +<tr class="codeline" data-linenumber="314"><td class="num" id="LN314">314</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"PR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="315"><td class="num" id="LN315">315</td><td class="line"> info->cond.qualifier = QUALIFIER_PARTIAL;</td></tr> +<tr class="codeline" data-linenumber="316"><td class="num" id="LN316">316</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"TS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="317"><td class="num" id="LN317">317</td><td class="line"> info->cond.qualifier = QUALIFIER_THUNDERSTORM;</td></tr> +<tr class="codeline" data-linenumber="318"><td class="num" id="LN318">318</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"BL"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="319"><td class="num" id="LN319">319</td><td class="line"> info->cond.qualifier = QUALIFIER_BLOWING;</td></tr> +<tr class="codeline" data-linenumber="320"><td class="num" id="LN320">320</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"SH"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="321"><td class="num" id="LN321">321</td><td class="line"> info->cond.qualifier = QUALIFIER_SHOWERS;</td></tr> +<tr class="codeline" data-linenumber="322"><td class="num" id="LN322">322</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"DR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="323"><td class="num" id="LN323">323</td><td class="line"> info->cond.qualifier = QUALIFIER_DRIFTING;</td></tr> +<tr class="codeline" data-linenumber="324"><td class="num" id="LN324">324</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"FZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="325"><td class="num" id="LN325">325</td><td class="line"> info->cond.qualifier = QUALIFIER_FREEZING;</td></tr> +<tr class="codeline" data-linenumber="326"><td class="num" id="LN326">326</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="327"><td class="num" id="LN327">327</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="328"><td class="num" id="LN328">328</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="329"><td class="num" id="LN329">329</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="330"><td class="num" id="LN330">330</td><td class="line"> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="331"><td class="num" id="LN331">331</td><td class="line"> info->cond.phenomenon = PHENOMENON_DRIZZLE;</td></tr> +<tr class="codeline" data-linenumber="332"><td class="num" id="LN332">332</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"RA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="333"><td class="num" id="LN333">333</td><td class="line"> info->cond.phenomenon = PHENOMENON_RAIN;</td></tr> +<tr class="codeline" data-linenumber="334"><td class="num" id="LN334">334</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SN"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="335"><td class="num" id="LN335">335</td><td class="line"> info->cond.phenomenon = PHENOMENON_SNOW;</td></tr> +<tr class="codeline" data-linenumber="336"><td class="num" id="LN336">336</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SG"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="337"><td class="num" id="LN337">337</td><td class="line"> info->cond.phenomenon = PHENOMENON_SNOW_GRAINS;</td></tr> +<tr class="codeline" data-linenumber="338"><td class="num" id="LN338">338</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"IC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="339"><td class="num" id="LN339">339</td><td class="line"> info->cond.phenomenon = PHENOMENON_ICE_CRYSTALS;</td></tr> +<tr class="codeline" data-linenumber="340"><td class="num" id="LN340">340</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PE"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="341"><td class="num" id="LN341">341</td><td class="line"> info->cond.phenomenon = PHENOMENON_ICE_PELLETS;</td></tr> +<tr class="codeline" data-linenumber="342"><td class="num" id="LN342">342</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"GR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="343"><td class="num" id="LN343">343</td><td class="line"> info->cond.phenomenon = PHENOMENON_HAIL;</td></tr> +<tr class="codeline" data-linenumber="344"><td class="num" id="LN344">344</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"GS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="345"><td class="num" id="LN345">345</td><td class="line"> info->cond.phenomenon = PHENOMENON_SMALL_HAIL;</td></tr> +<tr class="codeline" data-linenumber="346"><td class="num" id="LN346">346</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"UP"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="347"><td class="num" id="LN347">347</td><td class="line"> info->cond.phenomenon = PHENOMENON_UNKNOWN_PRECIPITATION;</td></tr> +<tr class="codeline" data-linenumber="348"><td class="num" id="LN348">348</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"BR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="349"><td class="num" id="LN349">349</td><td class="line"> info->cond.phenomenon = PHENOMENON_MIST;</td></tr> +<tr class="codeline" data-linenumber="350"><td class="num" id="LN350">350</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FG"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="351"><td class="num" id="LN351">351</td><td class="line"> info->cond.phenomenon = PHENOMENON_FOG;</td></tr> +<tr class="codeline" data-linenumber="352"><td class="num" id="LN352">352</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FU"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="353"><td class="num" id="LN353">353</td><td class="line"> info->cond.phenomenon = PHENOMENON_SMOKE;</td></tr> +<tr class="codeline" data-linenumber="354"><td class="num" id="LN354">354</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"VA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="355"><td class="num" id="LN355">355</td><td class="line"> info->cond.phenomenon = PHENOMENON_VOLCANIC_ASH;</td></tr> +<tr class="codeline" data-linenumber="356"><td class="num" id="LN356">356</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="357"><td class="num" id="LN357">357</td><td class="line"> info->cond.phenomenon = PHENOMENON_SAND;</td></tr> +<tr class="codeline" data-linenumber="358"><td class="num" id="LN358">358</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"HZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="359"><td class="num" id="LN359">359</td><td class="line"> info->cond.phenomenon = PHENOMENON_HAZE;</td></tr> +<tr class="codeline" data-linenumber="360"><td class="num" id="LN360">360</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PY"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="361"><td class="num" id="LN361">361</td><td class="line"> info->cond.phenomenon = PHENOMENON_SPRAY;</td></tr> +<tr class="codeline" data-linenumber="362"><td class="num" id="LN362">362</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DU"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="363"><td class="num" id="LN363">363</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUST;</td></tr> +<tr class="codeline" data-linenumber="364"><td class="num" id="LN364">364</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SQ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="365"><td class="num" id="LN365">365</td><td class="line"> info->cond.phenomenon = PHENOMENON_SQUALL;</td></tr> +<tr class="codeline" data-linenumber="366"><td class="num" id="LN366">366</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="367"><td class="num" id="LN367">367</td><td class="line"> info->cond.phenomenon = PHENOMENON_SANDSTORM;</td></tr> +<tr class="codeline" data-linenumber="368"><td class="num" id="LN368">368</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="369"><td class="num" id="LN369">369</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUSTSTORM;</td></tr> +<tr class="codeline" data-linenumber="370"><td class="num" id="LN370">370</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PO"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="371"><td class="num" id="LN371">371</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUST_WHIRLS;</td></tr> +<tr class="codeline" data-linenumber="372"><td class="num" id="LN372">372</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"+FC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="373"><td class="num" id="LN373">373</td><td class="line"> info->cond.phenomenon = PHENOMENON_TORNADO;</td></tr> +<tr class="codeline" data-linenumber="374"><td class="num" id="LN374">374</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="375"><td class="num" id="LN375">375</td><td class="line"> info->cond.phenomenon = PHENOMENON_FUNNEL_CLOUD;</td></tr> +<tr class="codeline" data-linenumber="376"><td class="num" id="LN376">376</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="377"><td class="num" id="LN377">377</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="378"><td class="num" id="LN378">378</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="379"><td class="num" id="LN379">379</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="380"><td class="num" id="LN380">380</td><td class="line"> <span class='keyword'>if</span> ((info->cond.qualifier != QUALIFIER_NONE) || (info->cond.phenomenon != PHENOMENON_NONE))</td></tr> +<tr class="codeline" data-linenumber="381"><td class="num" id="LN381">381</td><td class="line"> info->cond.significant = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="382"><td class="num" id="LN382">382</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="383"><td class="num" id="LN383">383</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="384"><td class="num" id="LN384">384</td><td class="line"><span class='directive'>#define <span class='macro'>TIME_RE_STR<span class='macro_popup'>"([0-9]{6})Z"</span></span> "([0-9]{6})Z"</span></td></tr> +<tr class="codeline" data-linenumber="385"><td class="num" id="LN385">385</td><td class="line"><span class='directive'>#define <span class='macro'>WIND_RE_STR<span class='macro_popup'>"(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></span> "(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></td></tr> +<tr class="codeline" data-linenumber="386"><td class="num" id="LN386">386</td><td class="line"><span class='directive'>#define <span class='macro'>VIS_RE_STR<span class='macro_popup'>"((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" "([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|"<br> "CAVOK"</span></span> "((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" \</span></td></tr> +<tr class="codeline" data-linenumber="387"><td class="num" id="LN387">387</td><td class="line"> <span class='directive'>"([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|" \</span></td></tr> +<tr class="codeline" data-linenumber="388"><td class="num" id="LN388">388</td><td class="line"> <span class='directive'>"CAVOK"</span></td></tr> +<tr class="codeline" data-linenumber="389"><td class="num" id="LN389">389</td><td class="line"><span class='directive'>#define <span class='macro'>COND_RE_STR<span class='macro_popup'>"(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></span> "(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></td></tr> +<tr class="codeline" data-linenumber="390"><td class="num" id="LN390">390</td><td class="line"><span class='directive'>#define <span class='macro'>CLOUD_RE_STR<span class='macro_popup'>"((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></span> "((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></td></tr> +<tr class="codeline" data-linenumber="391"><td class="num" id="LN391">391</td><td class="line"><span class='directive'>#define <span class='macro'>TEMP_RE_STR<span class='macro_popup'>"(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></span> "(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></td></tr> +<tr class="codeline" data-linenumber="392"><td class="num" id="LN392">392</td><td class="line"><span class='directive'>#define <span class='macro'>PRES_RE_STR<span class='macro_popup'>"(A|Q)([0-9]{4})"</span></span> "(A|Q)([0-9]{4})"</span></td></tr> +<tr class="codeline" data-linenumber="393"><td class="num" id="LN393">393</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="394"><td class="num" id="LN394">394</td><td class="line"><span class='comment'>/* POSIX regular expressions do not allow us to express "match whole words</span></td></tr> +<tr class="codeline" data-linenumber="395"><td class="num" id="LN395">395</td><td class="line"> <span class='comment'>* only" in a simple way, so we have to wrap them all into</span></td></tr> +<tr class="codeline" data-linenumber="396"><td class="num" id="LN396">396</td><td class="line"> <span class='comment'>* (^| )(...regex...)( |$)</span></td></tr> +<tr class="codeline" data-linenumber="397"><td class="num" id="LN397">397</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="398"><td class="num" id="LN398">398</td><td class="line"><span class='directive'>#define <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> "(^| )("</span></td></tr> +<tr class="codeline" data-linenumber="399"><td class="num" id="LN399">399</td><td class="line"><span class='directive'>#define <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span> ")( |$)"</span></td></tr> +<tr class="codeline" data-linenumber="400"><td class="num" id="LN400">400</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="401"><td class="num" id="LN401">401</td><td class="line"><span class='keyword'>static</span> regex_t metar_re[RE_NUM];</td></tr> +<tr class="codeline" data-linenumber="402"><td class="num" id="LN402">402</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> (*metar_f[RE_NUM]) (gchar *tokp, WeatherInfo *info);</td></tr> +<tr class="codeline" data-linenumber="403"><td class="num" id="LN403">403</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="404"><td class="num" id="LN404">404</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="405"><td class="num" id="LN405">405</td><td class="line">metar_init_re (<span class='keyword'>void</span>)</td></tr> +<tr class="codeline" data-linenumber="406"><td class="num" id="LN406">406</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="407"><td class="num" id="LN407">407</td><td class="line"> <span class='keyword'>static</span> gboolean initialized = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="408"><td class="num" id="LN408">408</td><td class="line"> <span class='keyword'>if</span> (initialized)</td></tr> +<tr class="codeline" data-linenumber="409"><td class="num" id="LN409">409</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="410"><td class="num" id="LN410">410</td><td class="line"> initialized = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="411"><td class="num" id="LN411">411</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="412"><td class="num" id="LN412">412</td><td class="line"> regcomp (&metar_re[TIME_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>TIME_RE_STR<span class='macro_popup'>"([0-9]{6})Z"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="413"><td class="num" id="LN413">413</td><td class="line"> regcomp (&metar_re[WIND_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>WIND_RE_STR<span class='macro_popup'>"(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="414"><td class="num" id="LN414">414</td><td class="line"> regcomp (&metar_re[VIS_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>VIS_RE_STR<span class='macro_popup'>"((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" "([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|"<br> "CAVOK"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="415"><td class="num" id="LN415">415</td><td class="line"> regcomp (&metar_re[COND_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>COND_RE_STR<span class='macro_popup'>"(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="416"><td class="num" id="LN416">416</td><td class="line"> regcomp (&metar_re[CLOUD_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>CLOUD_RE_STR<span class='macro_popup'>"((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="417"><td class="num" id="LN417">417</td><td class="line"> regcomp (&metar_re[TEMP_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>TEMP_RE_STR<span class='macro_popup'>"(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="418"><td class="num" id="LN418">418</td><td class="line"> regcomp (&metar_re[PRES_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>PRES_RE_STR<span class='macro_popup'>"(A|Q)([0-9]{4})"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="419"><td class="num" id="LN419">419</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="420"><td class="num" id="LN420">420</td><td class="line"> metar_f[TIME_RE] = metar_tok_time;</td></tr> +<tr class="codeline" data-linenumber="421"><td class="num" id="LN421">421</td><td class="line"> metar_f[WIND_RE] = metar_tok_wind;</td></tr> +<tr class="codeline" data-linenumber="422"><td class="num" id="LN422">422</td><td class="line"> metar_f[VIS_RE] = metar_tok_vis;</td></tr> +<tr class="codeline" data-linenumber="423"><td class="num" id="LN423">423</td><td class="line"> metar_f[COND_RE] = metar_tok_cond;</td></tr> +<tr class="codeline" data-linenumber="424"><td class="num" id="LN424">424</td><td class="line"> metar_f[CLOUD_RE] = metar_tok_cloud;</td></tr> +<tr class="codeline" data-linenumber="425"><td class="num" id="LN425">425</td><td class="line"> metar_f[TEMP_RE] = metar_tok_temp;</td></tr> +<tr class="codeline" data-linenumber="426"><td class="num" id="LN426">426</td><td class="line"> metar_f[PRES_RE] = metar_tok_pres;</td></tr> +<tr class="codeline" data-linenumber="427"><td class="num" id="LN427">427</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="428"><td class="num" id="LN428">428</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="429"><td class="num" id="LN429">429</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="430"><td class="num" id="LN430">430</td><td class="line">metar_parse (gchar *metar, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="431"><td class="num" id="LN431">431</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="432"><td class="num" id="LN432">432</td><td class="line"> gchar *p;</td></tr> +<tr class="codeline" data-linenumber="433"><td class="num" id="LN433">433</td><td class="line"> <span class='comment'>//gchar *rmk;</span></td></tr> +<tr class="codeline" data-linenumber="434"><td class="num" id="LN434">434</td><td class="line"> gint i, i2;</td></tr> +<tr class="codeline" data-linenumber="435"><td class="num" id="LN435">435</td><td class="line"> regmatch_t rm, rm2;</td></tr> +<tr class="codeline" data-linenumber="436"><td class="num" id="LN436">436</td><td class="line"> gchar *tokp;</td></tr> +<tr class="codeline" data-linenumber="437"><td class="num" id="LN437">437</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="438"><td class="num" id="LN438">438</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_14<br>; if (info != ((void*)0)) _g_boolean_var_14 = 1; else _g_boolean_var_14<br> = 0; _g_boolean_var_14; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="439"><td class="num" id="LN439">439</td><td class="line"> <span class='macro'>g_return_val_if_fail (metar != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_15<br>; if (metar != ((void*)0)) _g_boolean_var_15 = 1; else _g_boolean_var_15<br> = 0; _g_boolean_var_15; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "metar != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="440"><td class="num" id="LN440">440</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="441"><td class="num" id="LN441">441</td><td class="line"> metar_init_re ();</td></tr> +<tr class="codeline" data-linenumber="442"><td class="num" id="LN442">442</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="443"><td class="num" id="LN443">443</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="444"><td class="num" id="LN444">444</td><td class="line"> <span class='comment'>* Force parsing to end at "RMK" field. This prevents a subtle</span></td></tr> +<tr class="codeline" data-linenumber="445"><td class="num" id="LN445">445</td><td class="line"> <span class='comment'>* problem when info within the remark happens to match an earlier state</span></td></tr> +<tr class="codeline" data-linenumber="446"><td class="num" id="LN446">446</td><td class="line"> <span class='comment'>* and, as a result, throws off all the remaining expression</span></td></tr> +<tr class="codeline" data-linenumber="447"><td class="num" id="LN447">447</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="448"><td class="num" id="LN448">448</td><td class="line"> <span class='keyword'>if</span> (0 != (p = strstr (metar, <span class='string_literal'>" RMK "</span>))) {</td></tr> +<tr class="codeline" data-linenumber="449"><td class="num" id="LN449">449</td><td class="line"> *p = '\0';</td></tr> +<tr class="codeline" data-linenumber="450"><td class="num" id="LN450">450</td><td class="line"> <span class='comment'>//rmk = p + 5; // uncomment this if RMK data becomes useful</span></td></tr> +<tr class="codeline" data-linenumber="451"><td class="num" id="LN451">451</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="452"><td class="num" id="LN452">452</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="453"><td class="num" id="LN453">453</td><td class="line"> p = metar;</td></tr> +<tr class="codeline" data-linenumber="454"><td class="num" id="LN454">454</td><td class="line"> i = TIME_RE;</td></tr> +<tr class="codeline" data-linenumber="455"><td class="num" id="LN455">455</td><td class="line"> <span class='keyword'>while</span> (*p) {</td></tr> +<tr class="codeline" data-linenumber="456"><td class="num" id="LN456">456</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="457"><td class="num" id="LN457">457</td><td class="line"> i2 = RE_NUM;</td></tr> +<tr class="codeline" data-linenumber="458"><td class="num" id="LN458">458</td><td class="line"> rm2.rm_so = strlen (p);</td></tr> +<tr class="codeline" data-linenumber="459"><td class="num" id="LN459">459</td><td class="line"> rm2.rm_eo = rm2.rm_so;</td></tr> +<tr class="codeline" data-linenumber="460"><td class="num" id="LN460">460</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="461"><td class="num" id="LN461">461</td><td class="line"> <span class='keyword'>for</span> (i = 0; i < RE_NUM && rm2.rm_so > 0; i++) {</td></tr> +<tr class="codeline" data-linenumber="462"><td class="num" id="LN462">462</td><td class="line"> <span class='keyword'>if</span> (0 == regexec (&metar_re[i], p, 1, &rm, 0)</td></tr> +<tr class="codeline" data-linenumber="463"><td class="num" id="LN463">463</td><td class="line"> && rm.rm_so < rm2.rm_so)</td></tr> +<tr class="codeline" data-linenumber="464"><td class="num" id="LN464">464</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="465"><td class="num" id="LN465">465</td><td class="line"> i2 = i;</td></tr> +<tr class="codeline" data-linenumber="466"><td class="num" id="LN466">466</td><td class="line"> <span class='comment'>/* Skip leading and trailing space characters, if present.</span></td></tr> +<tr class="codeline" data-linenumber="467"><td class="num" id="LN467">467</td><td class="line"> <span class='comment'>(the regular expressions include those characters to</span></td></tr> +<tr class="codeline" data-linenumber="468"><td class="num" id="LN468">468</td><td class="line"> <span class='comment'>only get matches limited to whole words). */</span></td></tr> +<tr class="codeline" data-linenumber="469"><td class="num" id="LN469">469</td><td class="line"> <span class='keyword'>if</span> (p[rm.rm_so] == ' ') rm.rm_so++;</td></tr> +<tr class="codeline" data-linenumber="470"><td class="num" id="LN470">470</td><td class="line"> <span class='keyword'>if</span> (p[rm.rm_eo - 1] == ' ') rm.rm_eo--;</td></tr> +<tr class="codeline" data-linenumber="471"><td class="num" id="LN471">471</td><td class="line"> rm2.rm_so = rm.rm_so;</td></tr> +<tr class="codeline" data-linenumber="472"><td class="num" id="LN472">472</td><td class="line"> rm2.rm_eo = rm.rm_eo;</td></tr> +<tr class="codeline" data-linenumber="473"><td class="num" id="LN473">473</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="474"><td class="num" id="LN474">474</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="475"><td class="num" id="LN475">475</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="476"><td class="num" id="LN476">476</td><td class="line"> <span class='keyword'>if</span> (i2 != RE_NUM) {</td></tr> +<tr class="codeline" data-linenumber="477"><td class="num" id="LN477">477</td><td class="line"> tokp = g_strndup (p + rm2.rm_so, rm2.rm_eo - rm2.rm_so);</td></tr> +<tr class="codeline" data-linenumber="478"><td class="num" id="LN478">478</td><td class="line"> metar_f[i2] (tokp, info);</td></tr> +<tr class="codeline" data-linenumber="479"><td class="num" id="LN479">479</td><td class="line"> g_free (tokp);</td></tr> +<tr class="codeline" data-linenumber="480"><td class="num" id="LN480">480</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="481"><td class="num" id="LN481">481</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="482"><td class="num" id="LN482">482</td><td class="line"> p += rm2.rm_eo;</td></tr> +<tr class="codeline" data-linenumber="483"><td class="num" id="LN483">483</td><td class="line"> p += strspn (p, <span class='string_literal'>" "</span>);</td></tr> +<tr class="codeline" data-linenumber="484"><td class="num" id="LN484">484</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="485"><td class="num" id="LN485">485</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="486"><td class="num" id="LN486">486</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="487"><td class="num" id="LN487">487</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="488"><td class="num" id="LN488">488</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="489"><td class="num" id="LN489">489</td><td class="line">metar_finish (SoupSession *session, SoupMessage *msg, gpointer data)</td></tr> +<tr class="codeline" data-linenumber="490"><td class="num" id="LN490">490</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="491"><td class="num" id="LN491">491</td><td class="line"> WeatherInfo *info = (WeatherInfo *)data;</td></tr> +<tr class="codeline" data-linenumber="492"><td class="num" id="LN492">492</td><td class="line"> WeatherLocation *loc;</td></tr> +<tr class="codeline" data-linenumber="493"><td class="num" id="LN493">493</td><td class="line"> <span class='keyword'>const</span> gchar *p, *endtag;</td></tr> +<tr class="codeline" data-linenumber="494"><td class="num" id="LN494">494</td><td class="line"> gchar *searchkey, *metar;</td></tr> +<tr class="codeline" data-linenumber="495"><td class="num" id="LN495">495</td><td class="line"> gboolean success = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="496"><td class="num" id="LN496">496</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="497"><td class="num" id="LN497">497</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_16<br>; if (info != ((void*)0)) _g_boolean_var_16 = 1; else _g_boolean_var_16<br> = 0; _g_boolean_var_16; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="498"><td class="num" id="LN498">498</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="499"><td class="num" id="LN499">499</td><td class="line"> <span class='keyword'>if</span> (!<span class='macro'>SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)<span class='macro_popup'>((msg->status_code) >= 200 && (msg->status_code<br>) < 300)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="500"><td class="num" id="LN500">500</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)<span class='macro_popup'>((msg->status_code) > 0 && (msg->status_code<br>) < 100)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="501"><td class="num" id="LN501">501</td><td class="line"> info->network_error = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="502"><td class="num" id="LN502">502</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="503"><td class="num" id="LN503">503</td><td class="line"> <span class='comment'>/* Translators: %d is an error code, and %s the error string */</span></td></tr> +<tr class="codeline" data-linenumber="504"><td class="num" id="LN504">504</td><td class="line"> g_warning (<span class='macro'>_(<span class='string_literal'>"Failed to get METAR data: %d %s.\n"</span>)<span class='macro_popup'>(mateweather_gettext ("Failed to get METAR data: %d %s.\n"))</span></span>,</td></tr> +<tr class="codeline" data-linenumber="505"><td class="num" id="LN505">505</td><td class="line"> msg->status_code, msg->reason_phrase);</td></tr> +<tr class="codeline" data-linenumber="506"><td class="num" id="LN506">506</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="507"><td class="num" id="LN507">507</td><td class="line"> request_done (info, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="508"><td class="num" id="LN508">508</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="509"><td class="num" id="LN509">509</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="510"><td class="num" id="LN510">510</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="511"><td class="num" id="LN511">511</td><td class="line"> loc = info->location;</td></tr> +<tr class="codeline" data-linenumber="512"><td class="num" id="LN512">512</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="513"><td class="num" id="LN513">513</td><td class="line"> searchkey = g_strdup_printf (<span class='string_literal'>"<raw_text>%s"</span>, loc->code);</td></tr> +<tr class="codeline" data-linenumber="514"><td class="num" id="LN514">514</td><td class="line"> p = strstr (msg->response_body->data, searchkey);</td></tr> +<tr class="codeline" data-linenumber="515"><td class="num" id="LN515">515</td><td class="line"> g_free (searchkey);</td></tr> +<tr class="codeline" data-linenumber="516"><td class="num" id="LN516">516</td><td class="line"> <span class='keyword'>if</span> (p) {</td></tr> +<tr class="codeline" data-linenumber="517"><td class="num" id="LN517">517</td><td class="line"> p += <span class='macro'>WEATHER_LOCATION_CODE_LEN<span class='macro_popup'>4</span></span> + 11;</td></tr> +<tr class="codeline" data-linenumber="518"><td class="num" id="LN518">518</td><td class="line"> endtag = strstr (p, <span class='string_literal'>"</raw_text>"</span>);</td></tr> +<tr class="codeline" data-linenumber="519"><td class="num" id="LN519">519</td><td class="line"> <span class='keyword'>if</span> (endtag)</td></tr> +<tr class="codeline" data-linenumber="520"><td class="num" id="LN520">520</td><td class="line"> metar = g_strndup (p, endtag - p);</td></tr> +<tr class="codeline" data-linenumber="521"><td class="num" id="LN521">521</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="522"><td class="num" id="LN522">522</td><td class="line"> metar = <span class='macro'>g_strdup (p)<span class='macro_popup'>g_strdup_inline (p)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="523"><td class="num" id="LN523">523</td><td class="line"> success = metar_parse (metar, info);</td></tr> +<tr class="codeline" data-linenumber="524"><td class="num" id="LN524">524</td><td class="line"> g_free (metar);</td></tr> +<tr class="codeline" data-linenumber="525"><td class="num" id="LN525">525</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strstr (msg->response_body->data, <span class='string_literal'>"aviationweather.gov"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="526"><td class="num" id="LN526">526</td><td class="line"> <span class='comment'>/* The response doesn't even seem to have come from NOAA...</span></td></tr> +<tr class="codeline" data-linenumber="527"><td class="num" id="LN527">527</td><td class="line"> <span class='comment'>* most likely it is a wifi hotspot login page. Call that a</span></td></tr> +<tr class="codeline" data-linenumber="528"><td class="num" id="LN528">528</td><td class="line"> <span class='comment'>* network error.</span></td></tr> +<tr class="codeline" data-linenumber="529"><td class="num" id="LN529">529</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="530"><td class="num" id="LN530">530</td><td class="line"> info->network_error = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="531"><td class="num" id="LN531">531</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="532"><td class="num" id="LN532">532</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="533"><td class="num" id="LN533">533</td><td class="line"> info->valid = success;</td></tr> +<tr class="codeline" data-linenumber="534"><td class="num" id="LN534">534</td><td class="line"> request_done (info, <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="535"><td class="num" id="LN535">535</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="536"><td class="num" id="LN536">536</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="537"><td class="num" id="LN537">537</td><td class="line"><span class='comment'>/* Read current conditions and fill in info structure */</span></td></tr> +<tr class="codeline" data-linenumber="538"><td class="num" id="LN538">538</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="539"><td class="num" id="LN539">539</td><td class="line">metar_start_open (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="540"><td class="num" id="LN540">540</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="541"><td class="num" id="LN541">541</td><td class="line"> WeatherLocation *loc;</td></tr> +<tr class="codeline" data-linenumber="542"><td class="num" id="LN542">542</td><td class="line"> SoupMessage *msg;</td></tr> +<tr class="codeline" data-linenumber="543"><td class="num" id="LN543">543</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="544"><td class="num" id="LN544">544</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_17<br>; if (info != ((void*)0)) _g_boolean_var_17 = 1; else _g_boolean_var_17<br> = 0; _g_boolean_var_17; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="545"><td class="num" id="LN545">545</td><td class="line"> info->valid = info->network_error = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="546"><td class="num" id="LN546">546</td><td class="line"> loc = info->location;</td></tr> +<tr class="codeline" data-linenumber="547"><td class="num" id="LN547">547</td><td class="line"> <span class='keyword'>if</span> (loc == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="548"><td class="num" id="LN548">548</td><td class="line"> g_warning (<span class='macro'>_(<span class='string_literal'>"WeatherInfo missing location"</span>)<span class='macro_popup'>(mateweather_gettext ("WeatherInfo missing location"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="549"><td class="num" id="LN549">549</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="550"><td class="num" id="LN550">550</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="551"><td class="num" id="LN551">551</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="552"><td class="num" id="LN552">552</td><td class="line"> msg = soup_form_request_new (</td></tr> +<tr class="codeline" data-linenumber="553"><td class="num" id="LN553">553</td><td class="line"> <span class='string_literal'>"GET"</span>, <span class='string_literal'>"https://aviationweather.gov/cgi-bin/data/dataserver.php"</span>,</td></tr> +<tr class="codeline" data-linenumber="554"><td class="num" id="LN554">554</td><td class="line"> <span class='string_literal'>"dataSource"</span>, <span class='string_literal'>"metars"</span>,</td></tr> +<tr class="codeline" data-linenumber="555"><td class="num" id="LN555">555</td><td class="line"> <span class='string_literal'>"requestType"</span>, <span class='string_literal'>"retrieve"</span>,</td></tr> +<tr class="codeline" data-linenumber="556"><td class="num" id="LN556">556</td><td class="line"> <span class='string_literal'>"format"</span>, <span class='string_literal'>"xml"</span>,</td></tr> +<tr class="codeline" data-linenumber="557"><td class="num" id="LN557">557</td><td class="line"> <span class='string_literal'>"hoursBeforeNow"</span>, <span class='string_literal'>"3"</span>,</td></tr> +<tr class="codeline" data-linenumber="558"><td class="num" id="LN558">558</td><td class="line"> <span class='string_literal'>"mostRecent"</span>, <span class='string_literal'>"true"</span>,</td></tr> +<tr class="codeline" data-linenumber="559"><td class="num" id="LN559">559</td><td class="line"> <span class='string_literal'>"fields"</span>, <span class='string_literal'>"raw_text"</span>,</td></tr> +<tr class="codeline" data-linenumber="560"><td class="num" id="LN560">560</td><td class="line"> <span class='string_literal'>"stationString"</span>, loc->code,</td></tr> +<tr class="codeline" data-linenumber="561"><td class="num" id="LN561">561</td><td class="line"> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="562"><td class="num" id="LN562">562</td><td class="line"> soup_session_queue_message (info->session, msg, metar_finish, info);</td></tr> +<tr class="codeline" data-linenumber="563"><td class="num" id="LN563">563</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="564"><td class="num" id="LN564">564</td><td class="line"> info->requests_pending++;</td></tr> +<tr class="codeline" data-linenumber="565"><td class="num" id="LN565">565</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-9e62c0.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-9e62c0.html new file mode 100644 index 0000000..bf14720 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-9e62c0.html @@ -0,0 +1,2352 @@ +<!doctype html> +<html> +<head> +<title>weather.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119 --> + +<!-- BUGTYPE Potential insecure memory buffer bounds restriction in call 'strcpy' --> + +<!-- BUGCATEGORY Security --> + +<!-- BUGFILE /rootdir/libmateweather/weather.c --> + +<!-- FILENAME weather.c --> + +<!-- FUNCTIONNAME weather_info_get_update --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT 9e62c0dc8b466d7b75780ad89f08c6b7 --> + +<!-- BUGLINE 719 --> + +<!-- BUGCOLUMN 2 --> + +<!-- BUGPATHLENGTH 1 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 719, column 2</a><br />Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"719": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather.c - Overall weather server functions</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"><span class='directive'>#include <stdio.h></span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"><span class='directive'>#include <stdlib.h></span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"><span class='directive'>#include <assert.h></span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"><span class='directive'>#include <string.h></span></td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"><span class='directive'>#include <ctype.h></span></td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#include <math.h></span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#include <fenv.h></span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"><span class='directive'>#ifdef HAVE_VALUES_H</span></td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"><span class='directive'>#include <values.h></span></td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"><span class='directive'>#include <time.h></span></td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"><span class='directive'>#include <unistd.h></span></td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"><span class='directive'>#include <gdk-pixbuf/gdk-pixbuf.h></span></td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"><span class='directive'>#include "weather.h"</span></td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"><span class='directive'>#define <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span> 36</span></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line"> <span class='comment'>* SECTION:weather</span></td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> <span class='comment'>* @Title: weather</span></td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> _weather_internal_check (<span class='keyword'>void</span>);</td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>inline</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line">mateweather_gettext_init (<span class='keyword'>void</span>)</td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> <span class='keyword'>static</span> gsize mateweather_gettext_initialized = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>G_UNLIKELY (g_once_init_enter (&mateweather_gettext_initialized))<span class='macro_popup'>(__builtin_expect (__extension__ ({ int _g_boolean_var_148; if<br> ((__extension__ ({ _Static_assert (sizeof *(&mateweather_gettext_initialized<br>) == sizeof (gpointer), "Expression evaluates to false"); (void<br>) (0 ? (gpointer) *(&mateweather_gettext_initialized) : (<br>(void*)0)); (!(__extension__ ({ _Static_assert (sizeof *(&<br>mateweather_gettext_initialized) == sizeof (gpointer), "Expression evaluates to false"<br>); __typeof__ (*(&mateweather_gettext_initialized)) gapg_temp_newval<br>; __typeof__ ((&mateweather_gettext_initialized)) gapg_temp_atomic<br> = (&mateweather_gettext_initialized); __atomic_load (gapg_temp_atomic<br>, &gapg_temp_newval, 5); gapg_temp_newval; })) &&<br> g_once_init_enter (&mateweather_gettext_initialized)); }<br>))) _g_boolean_var_148 = 1; else _g_boolean_var_148 = 0; _g_boolean_var_148<br>; }), 0))</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> bindtextdomain (<span class='macro'>GETTEXT_PACKAGE<span class='macro_popup'>"libmateweather"</span></span>, <span class='macro'>MATELOCALEDIR<span class='macro_popup'>"/usr/local/share/locale"</span></span>);</td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"><span class='directive'>#ifdef HAVE_BIND_TEXTDOMAIN_CODESET</span></td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> bind_textdomain_codeset (<span class='macro'>GETTEXT_PACKAGE<span class='macro_popup'>"libmateweather"</span></span>, <span class='string_literal'>"UTF-8"</span>);</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> <span class='macro'>g_once_init_leave (&mateweather_gettext_initialized, TRUE)<span class='macro_popup'>(__extension__ ({ _Static_assert (sizeof *(&mateweather_gettext_initialized<br>) == sizeof (gpointer), "Expression evaluates to false"); 0 ?<br> (void) (*(&mateweather_gettext_initialized) = ((!(0)))) :<br> (void) 0; g_once_init_leave ((&mateweather_gettext_initialized<br>), (gsize) ((!(0)))); }))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"><span class='keyword'>const</span> <span class='keyword'>char</span> *</td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line">mateweather_gettext (<span class='keyword'>const</span> <span class='keyword'>char</span> *str)</td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"> mateweather_gettext_init ();</td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>dgettext (GETTEXT_PACKAGE, str)<span class='macro_popup'>dcgettext ("libmateweather", str, 5)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"><span class='keyword'>const</span> <span class='keyword'>char</span> *</td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line">mateweather_dpgettext (<span class='keyword'>const</span> <span class='keyword'>char</span> *context,</td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line"> <span class='keyword'>const</span> <span class='keyword'>char</span> *str)</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> mateweather_gettext_init ();</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> <span class='keyword'>return</span> g_dpgettext2 (<span class='macro'>GETTEXT_PACKAGE<span class='macro_popup'>"libmateweather"</span></span>, context, str);</td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line"> <span class='comment'>* Convert string of the form "DD-MM-SSH" to radians</span></td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line"> <span class='comment'>* DD:degrees (to 3 digits), MM:minutes, SS:seconds H:hemisphere (NESW)</span></td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line"> <span class='comment'>* Return value is positive for N,E; negative for S,W.</span></td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"><span class='keyword'>static</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line">dmsh2rad (<span class='keyword'>const</span> gchar *latlon)</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> <span class='keyword'>char</span> *p1, *p2;</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line"> <span class='keyword'>int</span> deg, min, sec, dir;</td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> gdouble value;</td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> <span class='keyword'>if</span> (latlon == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> p1 = strchr (latlon, '-');</td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> p2 = strrchr (latlon, '-');</td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"> <span class='keyword'>if</span> (p1 == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span> || p1 == latlon) {</td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (p1 == p2) {</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> sscanf (latlon, <span class='string_literal'>"%d-%d"</span>, &deg, &min);</td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line"> sec = 0;</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (p2 == 1 + p1) {</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> sscanf (latlon, <span class='string_literal'>"%d-%d-%d"</span>, &deg, &min, &sec);</td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> <span class='keyword'>if</span> (deg > 180 || min >= 60 || sec >= 60)</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> value = (gdouble)((deg * 60 + min) * 60 + sec) * <span class='macro'>M_PI<span class='macro_popup'>3.14159265358979323846</span></span> / 648000.;</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> dir = g_ascii_toupper (latlon[strlen (latlon) - 1]);</td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line"> <span class='keyword'>if</span> (dir == 'W' || dir == 'S')</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> value = -value;</td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (dir != 'E' && dir != 'N' && (value != 0.0 || dir != '0'))</td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line"> value = <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> <span class='keyword'>return</span> value;</td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line">WeatherLocation *</td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line">weather_location_new (<span class='keyword'>const</span> gchar *name, <span class='keyword'>const</span> gchar *code,</td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line"> <span class='keyword'>const</span> gchar *zone, <span class='keyword'>const</span> gchar *radar,</td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line"> <span class='keyword'>const</span> gchar *coordinates,</td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line"> <span class='keyword'>const</span> gchar *country_code,</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> <span class='keyword'>const</span> gchar *tz_hint)</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line"> WeatherLocation *location;</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> _weather_internal_check ();</td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> location = <span class='macro'>g_new (WeatherLocation, 1)<span class='macro_popup'>(WeatherLocation *) (__extension__ ({ gsize __n = (gsize) (1)<br>; gsize __s = sizeof (WeatherLocation); gpointer __p; if (__s<br> == 1) __p = g_malloc (__n); else if (__builtin_constant_p (__n<br>) && (__s == 0 || __n <= (9223372036854775807L *2UL<br>+1UL) / __s)) __p = g_malloc (__n * __s); else __p = g_malloc_n<br> (__n, __s); __p; }))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> <span class='comment'>/* name and metar code must be set */</span></td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> location->name = <span class='macro'>g_strdup (name)<span class='macro_popup'>g_strdup_inline (name)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> location->code = <span class='macro'>g_strdup (code)<span class='macro_popup'>g_strdup_inline (code)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> <span class='keyword'>if</span> (zone) {</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> location->zone = <span class='macro'>g_strdup (zone)<span class='macro_popup'>g_strdup_inline (zone)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> location->zone = <span class='macro'>g_strdup (<span class='string_literal'>"------"</span>)<span class='macro_popup'>g_strdup_inline ("------")</span></span>;</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line"> <span class='keyword'>if</span> (radar) {</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> location->radar = <span class='macro'>g_strdup (radar)<span class='macro_popup'>g_strdup_inline (radar)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line"> location->radar = <span class='macro'>g_strdup (<span class='string_literal'>"---"</span>)<span class='macro_popup'>g_strdup_inline ("---")</span></span>;</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"> <span class='keyword'>if</span> (location->zone[0] == '-') {</td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line"> location->zone_valid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> location->zone_valid = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> location->coordinates = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> <span class='keyword'>if</span> (coordinates)</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> <span class='keyword'>char</span> **pieces;</td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line"> pieces = g_strsplit (coordinates, <span class='string_literal'>" "</span>, -1);</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> <span class='keyword'>if</span> (g_strv_length (pieces) == 2)</td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line"> location->coordinates = <span class='macro'>g_strdup (coordinates)<span class='macro_popup'>g_strdup_inline (coordinates)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line"> location->latitude = dmsh2rad (pieces[0]);</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> location->longitude = dmsh2rad (pieces[1]);</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> g_strfreev (pieces);</td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> <span class='keyword'>if</span> (!location->coordinates)</td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> location->coordinates = <span class='macro'>g_strdup (<span class='string_literal'>"---"</span>)<span class='macro_popup'>g_strdup_inline ("---")</span></span>;</td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> location->latitude = <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> location->longitude = <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>;</td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="179"><td class="num" id="LN179">179</td><td class="line"> location->latlon_valid = (location->latitude < <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span> && location->longitude < <span class='macro'>DBL_MAX<span class='macro_popup'>1.7976931348623157e+308</span></span>);</td></tr> +<tr class="codeline" data-linenumber="180"><td class="num" id="LN180">180</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="181"><td class="num" id="LN181">181</td><td class="line"> location->country_code = <span class='macro'>g_strdup (country_code)<span class='macro_popup'>g_strdup_inline (country_code)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="182"><td class="num" id="LN182">182</td><td class="line"> location->tz_hint = <span class='macro'>g_strdup (tz_hint)<span class='macro_popup'>g_strdup_inline (tz_hint)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="183"><td class="num" id="LN183">183</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="184"><td class="num" id="LN184">184</td><td class="line"> <span class='keyword'>return</span> location;</td></tr> +<tr class="codeline" data-linenumber="185"><td class="num" id="LN185">185</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="186"><td class="num" id="LN186">186</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="187"><td class="num" id="LN187">187</td><td class="line">WeatherLocation *</td></tr> +<tr class="codeline" data-linenumber="188"><td class="num" id="LN188">188</td><td class="line">weather_location_clone (<span class='keyword'>const</span> WeatherLocation *location)</td></tr> +<tr class="codeline" data-linenumber="189"><td class="num" id="LN189">189</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="190"><td class="num" id="LN190">190</td><td class="line"> WeatherLocation *clone;</td></tr> +<tr class="codeline" data-linenumber="191"><td class="num" id="LN191">191</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="192"><td class="num" id="LN192">192</td><td class="line"> <span class='macro'>g_return_val_if_fail (location != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_149<br>; if (location != ((void*)0)) _g_boolean_var_149 = 1; else _g_boolean_var_149<br> = 0; _g_boolean_var_149; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "location != NULL"<br>); return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="193"><td class="num" id="LN193">193</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="194"><td class="num" id="LN194">194</td><td class="line"> clone = weather_location_new (location->name,</td></tr> +<tr class="codeline" data-linenumber="195"><td class="num" id="LN195">195</td><td class="line"> location->code, location->zone,</td></tr> +<tr class="codeline" data-linenumber="196"><td class="num" id="LN196">196</td><td class="line"> location->radar, location->coordinates,</td></tr> +<tr class="codeline" data-linenumber="197"><td class="num" id="LN197">197</td><td class="line"> location->country_code, location->tz_hint);</td></tr> +<tr class="codeline" data-linenumber="198"><td class="num" id="LN198">198</td><td class="line"> clone->latitude = location->latitude;</td></tr> +<tr class="codeline" data-linenumber="199"><td class="num" id="LN199">199</td><td class="line"> clone->longitude = location->longitude;</td></tr> +<tr class="codeline" data-linenumber="200"><td class="num" id="LN200">200</td><td class="line"> clone->latlon_valid = location->latlon_valid;</td></tr> +<tr class="codeline" data-linenumber="201"><td class="num" id="LN201">201</td><td class="line"> <span class='keyword'>return</span> clone;</td></tr> +<tr class="codeline" data-linenumber="202"><td class="num" id="LN202">202</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="203"><td class="num" id="LN203">203</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="204"><td class="num" id="LN204">204</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="205"><td class="num" id="LN205">205</td><td class="line">weather_location_free (WeatherLocation *location)</td></tr> +<tr class="codeline" data-linenumber="206"><td class="num" id="LN206">206</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="207"><td class="num" id="LN207">207</td><td class="line"> <span class='keyword'>if</span> (location) {</td></tr> +<tr class="codeline" data-linenumber="208"><td class="num" id="LN208">208</td><td class="line"> g_free (location->name);</td></tr> +<tr class="codeline" data-linenumber="209"><td class="num" id="LN209">209</td><td class="line"> g_free (location->code);</td></tr> +<tr class="codeline" data-linenumber="210"><td class="num" id="LN210">210</td><td class="line"> g_free (location->zone);</td></tr> +<tr class="codeline" data-linenumber="211"><td class="num" id="LN211">211</td><td class="line"> g_free (location->radar);</td></tr> +<tr class="codeline" data-linenumber="212"><td class="num" id="LN212">212</td><td class="line"> g_free (location->coordinates);</td></tr> +<tr class="codeline" data-linenumber="213"><td class="num" id="LN213">213</td><td class="line"> g_free (location->country_code);</td></tr> +<tr class="codeline" data-linenumber="214"><td class="num" id="LN214">214</td><td class="line"> g_free (location->tz_hint);</td></tr> +<tr class="codeline" data-linenumber="215"><td class="num" id="LN215">215</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="216"><td class="num" id="LN216">216</td><td class="line"> g_free (location);</td></tr> +<tr class="codeline" data-linenumber="217"><td class="num" id="LN217">217</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="218"><td class="num" id="LN218">218</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="219"><td class="num" id="LN219">219</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="220"><td class="num" id="LN220">220</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="221"><td class="num" id="LN221">221</td><td class="line">weather_location_equal (<span class='keyword'>const</span> WeatherLocation *location1, <span class='keyword'>const</span> WeatherLocation *location2)</td></tr> +<tr class="codeline" data-linenumber="222"><td class="num" id="LN222">222</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="223"><td class="num" id="LN223">223</td><td class="line"> <span class='comment'>/* if something is NULL, then it's TRUE if and only if both are NULL) */</span></td></tr> +<tr class="codeline" data-linenumber="224"><td class="num" id="LN224">224</td><td class="line"> <span class='keyword'>if</span> (location1 == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span> || location2 == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="225"><td class="num" id="LN225">225</td><td class="line"> <span class='keyword'>return</span> (location1 == location2);</td></tr> +<tr class="codeline" data-linenumber="226"><td class="num" id="LN226">226</td><td class="line"> <span class='keyword'>if</span> (!location1->code || !location2->code)</td></tr> +<tr class="codeline" data-linenumber="227"><td class="num" id="LN227">227</td><td class="line"> <span class='keyword'>return</span> (location1->code == location2->code);</td></tr> +<tr class="codeline" data-linenumber="228"><td class="num" id="LN228">228</td><td class="line"> <span class='keyword'>if</span> (!location1->name || !location2->name)</td></tr> +<tr class="codeline" data-linenumber="229"><td class="num" id="LN229">229</td><td class="line"> <span class='keyword'>return</span> (location1->name == location2->name);</td></tr> +<tr class="codeline" data-linenumber="230"><td class="num" id="LN230">230</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="231"><td class="num" id="LN231">231</td><td class="line"> <span class='keyword'>return</span> ((strcmp (location1->code, location2->code) == 0) &&</td></tr> +<tr class="codeline" data-linenumber="232"><td class="num" id="LN232">232</td><td class="line"> (strcmp (location1->name, location2->name) == 0));</td></tr> +<tr class="codeline" data-linenumber="233"><td class="num" id="LN233">233</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="234"><td class="num" id="LN234">234</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="235"><td class="num" id="LN235">235</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *wind_direction_str[] = {</td></tr> +<tr class="codeline" data-linenumber="236"><td class="num" id="LN236">236</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Variable"</span>)<span class='macro_popup'>("Variable")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="237"><td class="num" id="LN237">237</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"North"</span>)<span class='macro_popup'>("North")</span></span>, <span class='macro'>N_(<span class='string_literal'>"North - NorthEast"</span>)<span class='macro_popup'>("North - NorthEast")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Northeast"</span>)<span class='macro_popup'>("Northeast")</span></span>, <span class='macro'>N_(<span class='string_literal'>"East - NorthEast"</span>)<span class='macro_popup'>("East - NorthEast")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="238"><td class="num" id="LN238">238</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"East"</span>)<span class='macro_popup'>("East")</span></span>, <span class='macro'>N_(<span class='string_literal'>"East - Southeast"</span>)<span class='macro_popup'>("East - Southeast")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Southeast"</span>)<span class='macro_popup'>("Southeast")</span></span>, <span class='macro'>N_(<span class='string_literal'>"South - Southeast"</span>)<span class='macro_popup'>("South - Southeast")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="239"><td class="num" id="LN239">239</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"South"</span>)<span class='macro_popup'>("South")</span></span>, <span class='macro'>N_(<span class='string_literal'>"South - Southwest"</span>)<span class='macro_popup'>("South - Southwest")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Southwest"</span>)<span class='macro_popup'>("Southwest")</span></span>, <span class='macro'>N_(<span class='string_literal'>"West - Southwest"</span>)<span class='macro_popup'>("West - Southwest")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="240"><td class="num" id="LN240">240</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"West"</span>)<span class='macro_popup'>("West")</span></span>, <span class='macro'>N_(<span class='string_literal'>"West - Northwest"</span>)<span class='macro_popup'>("West - Northwest")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Northwest"</span>)<span class='macro_popup'>("Northwest")</span></span>, <span class='macro'>N_(<span class='string_literal'>"North - Northwest"</span>)<span class='macro_popup'>("North - Northwest")</span></span></td></tr> +<tr class="codeline" data-linenumber="241"><td class="num" id="LN241">241</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="242"><td class="num" id="LN242">242</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="243"><td class="num" id="LN243">243</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="244"><td class="num" id="LN244">244</td><td class="line">weather_wind_direction_string (WeatherWindDirection wind)</td></tr> +<tr class="codeline" data-linenumber="245"><td class="num" id="LN245">245</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="246"><td class="num" id="LN246">246</td><td class="line"> <span class='keyword'>if</span> (wind <= WIND_INVALID || wind >= WIND_LAST)</td></tr> +<tr class="codeline" data-linenumber="247"><td class="num" id="LN247">247</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Invalid"</span>)<span class='macro_popup'>(mateweather_gettext ("Invalid"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="248"><td class="num" id="LN248">248</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="249"><td class="num" id="LN249">249</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(wind_direction_str[(<span class='keyword'>int</span>)wind])<span class='macro_popup'>(mateweather_gettext (wind_direction_str[(int)wind]))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="250"><td class="num" id="LN250">250</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="251"><td class="num" id="LN251">251</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="252"><td class="num" id="LN252">252</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *sky_str[] = {</td></tr> +<tr class="codeline" data-linenumber="253"><td class="num" id="LN253">253</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Clear Sky"</span>)<span class='macro_popup'>("Clear Sky")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="254"><td class="num" id="LN254">254</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Broken clouds"</span>)<span class='macro_popup'>("Broken clouds")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="255"><td class="num" id="LN255">255</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Scattered clouds"</span>)<span class='macro_popup'>("Scattered clouds")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="256"><td class="num" id="LN256">256</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Few clouds"</span>)<span class='macro_popup'>("Few clouds")</span></span>,</td></tr> +<tr class="codeline" data-linenumber="257"><td class="num" id="LN257">257</td><td class="line"> <span class='macro'>N_(<span class='string_literal'>"Overcast"</span>)<span class='macro_popup'>("Overcast")</span></span></td></tr> +<tr class="codeline" data-linenumber="258"><td class="num" id="LN258">258</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="259"><td class="num" id="LN259">259</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="260"><td class="num" id="LN260">260</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="261"><td class="num" id="LN261">261</td><td class="line">weather_sky_string (WeatherSky sky)</td></tr> +<tr class="codeline" data-linenumber="262"><td class="num" id="LN262">262</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="263"><td class="num" id="LN263">263</td><td class="line"> <span class='keyword'>if</span> (sky <= SKY_INVALID || sky >= SKY_LAST)</td></tr> +<tr class="codeline" data-linenumber="264"><td class="num" id="LN264">264</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Invalid"</span>)<span class='macro_popup'>(mateweather_gettext ("Invalid"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="265"><td class="num" id="LN265">265</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="266"><td class="num" id="LN266">266</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(sky_str[(<span class='keyword'>int</span>)sky])<span class='macro_popup'>(mateweather_gettext (sky_str[(int)sky]))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="267"><td class="num" id="LN267">267</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="268"><td class="num" id="LN268">268</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="269"><td class="num" id="LN269">269</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="270"><td class="num" id="LN270">270</td><td class="line"> <span class='comment'>* Even though tedious, I switched to a 2D array for weather condition</span></td></tr> +<tr class="codeline" data-linenumber="271"><td class="num" id="LN271">271</td><td class="line"> <span class='comment'>* strings, in order to facilitate internationalization, esp. for languages</span></td></tr> +<tr class="codeline" data-linenumber="272"><td class="num" id="LN272">272</td><td class="line"> <span class='comment'>* with genders.</span></td></tr> +<tr class="codeline" data-linenumber="273"><td class="num" id="LN273">273</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="274"><td class="num" id="LN274">274</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="275"><td class="num" id="LN275">275</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="276"><td class="num" id="LN276">276</td><td class="line"> <span class='comment'>* Almost all reportable combinations listed in</span></td></tr> +<tr class="codeline" data-linenumber="277"><td class="num" id="LN277">277</td><td class="line"> <span class='comment'>* http://www.crh.noaa.gov/arx/wx.tbl.php are entered below, except those</span></td></tr> +<tr class="codeline" data-linenumber="278"><td class="num" id="LN278">278</td><td class="line"> <span class='comment'>* having 2 qualifiers mixed together [such as "Blowing snow in vicinity"</span></td></tr> +<tr class="codeline" data-linenumber="279"><td class="num" id="LN279">279</td><td class="line"> <span class='comment'>* (VCBLSN), "Thunderstorm in vicinity" (VCTS), etc].</span></td></tr> +<tr class="codeline" data-linenumber="280"><td class="num" id="LN280">280</td><td class="line"> <span class='comment'>* Combinations that are not possible are filled in with "??".</span></td></tr> +<tr class="codeline" data-linenumber="281"><td class="num" id="LN281">281</td><td class="line"> <span class='comment'>* Some other exceptions not handled yet, such as "SN BLSN" which has</span></td></tr> +<tr class="codeline" data-linenumber="282"><td class="num" id="LN282">282</td><td class="line"> <span class='comment'>* special meaning.</span></td></tr> +<tr class="codeline" data-linenumber="283"><td class="num" id="LN283">283</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="284"><td class="num" id="LN284">284</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="285"><td class="num" id="LN285">285</td><td class="line"><span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="286"><td class="num" id="LN286">286</td><td class="line"> <span class='comment'>* Note, magic numbers, when you change the size here, make sure to change</span></td></tr> +<tr class="codeline" data-linenumber="287"><td class="num" id="LN287">287</td><td class="line"> <span class='comment'>* the below function so that new values are recognized</span></td></tr> +<tr class="codeline" data-linenumber="288"><td class="num" id="LN288">288</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="289"><td class="num" id="LN289">289</td><td class="line"><span class='comment'>/* NONE VICINITY LIGHT MODERATE HEAVY SHALLOW PATCHES PARTIAL THUNDERSTORM BLOWING SHOWERS DRIFTING FREEZING */</span></td></tr> +<tr class="codeline" data-linenumber="290"><td class="num" id="LN290">290</td><td class="line"><span class='comment'>/* *******************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/</span></td></tr> +<tr class="codeline" data-linenumber="291"><td class="num" id="LN291">291</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *conditions_str[24][13] = {</td></tr> +<tr class="codeline" data-linenumber="292"><td class="num" id="LN292">292</td><td class="line"><span class='comment'>/* Translators: If you want to know what "blowing" "shallow" "partial"</span></td></tr> +<tr class="codeline" data-linenumber="293"><td class="num" id="LN293">293</td><td class="line"> <span class='comment'>* etc means, you can go to http://www.weather.com/glossary/ and</span></td></tr> +<tr class="codeline" data-linenumber="294"><td class="num" id="LN294">294</td><td class="line"> <span class='comment'>* http://www.crh.noaa.gov/arx/wx.tbl.php */</span></td></tr> +<tr class="codeline" data-linenumber="295"><td class="num" id="LN295">295</td><td class="line"> <span class='comment'>/* NONE */</span> {<span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Thunderstorm"</span>)<span class='macro_popup'>("Thunderstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="296"><td class="num" id="LN296">296</td><td class="line"> <span class='comment'>/* DRIZZLE */</span> {<span class='macro'>N_(<span class='string_literal'>"Drizzle"</span>)<span class='macro_popup'>("Drizzle")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Light drizzle"</span>)<span class='macro_popup'>("Light drizzle")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate drizzle"</span>)<span class='macro_popup'>("Moderate drizzle")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy drizzle"</span>)<span class='macro_popup'>("Heavy drizzle")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Freezing drizzle"</span>)<span class='macro_popup'>("Freezing drizzle")</span></span> },</td></tr> +<tr class="codeline" data-linenumber="297"><td class="num" id="LN297">297</td><td class="line"> <span class='comment'>/* RAIN */</span> {<span class='macro'>N_(<span class='string_literal'>"Rain"</span>)<span class='macro_popup'>("Rain")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Light rain"</span>)<span class='macro_popup'>("Light rain")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate rain"</span>)<span class='macro_popup'>("Moderate rain")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy rain"</span>)<span class='macro_popup'>("Heavy rain")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Thunderstorm"</span>)<span class='macro_popup'>("Thunderstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Rain showers"</span>)<span class='macro_popup'>("Rain showers")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Freezing rain"</span>)<span class='macro_popup'>("Freezing rain")</span></span> },</td></tr> +<tr class="codeline" data-linenumber="298"><td class="num" id="LN298">298</td><td class="line"> <span class='comment'>/* SNOW */</span> {<span class='macro'>N_(<span class='string_literal'>"Snow"</span>)<span class='macro_popup'>("Snow")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Light snow"</span>)<span class='macro_popup'>("Light snow")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate snow"</span>)<span class='macro_popup'>("Moderate snow")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy snow"</span>)<span class='macro_popup'>("Heavy snow")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Snowstorm"</span>)<span class='macro_popup'>("Snowstorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Blowing snowfall"</span>)<span class='macro_popup'>("Blowing snowfall")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Snow showers"</span>)<span class='macro_popup'>("Snow showers")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Drifting snow"</span>)<span class='macro_popup'>("Drifting snow")</span></span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="299"><td class="num" id="LN299">299</td><td class="line"> <span class='comment'>/* SNOW_GRAINS */</span> {<span class='macro'>N_(<span class='string_literal'>"Snow grains"</span>)<span class='macro_popup'>("Snow grains")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Light snow grains"</span>)<span class='macro_popup'>("Light snow grains")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate snow grains"</span>)<span class='macro_popup'>("Moderate snow grains")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy snow grains"</span>)<span class='macro_popup'>("Heavy snow grains")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="300"><td class="num" id="LN300">300</td><td class="line"> <span class='comment'>/* ICE_CRYSTALS */</span> {<span class='macro'>N_(<span class='string_literal'>"Ice crystals"</span>)<span class='macro_popup'>("Ice crystals")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Ice crystals"</span>)<span class='macro_popup'>("Ice crystals")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="301"><td class="num" id="LN301">301</td><td class="line"> <span class='comment'>/* ICE_PELLETS */</span> {<span class='macro'>N_(<span class='string_literal'>"Ice pellets"</span>)<span class='macro_popup'>("Ice pellets")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Few ice pellets"</span>)<span class='macro_popup'>("Few ice pellets")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Moderate ice pellets"</span>)<span class='macro_popup'>("Moderate ice pellets")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy ice pellets"</span>)<span class='macro_popup'>("Heavy ice pellets")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Ice pellet storm"</span>)<span class='macro_popup'>("Ice pellet storm")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Showers of ice pellets"</span>)<span class='macro_popup'>("Showers of ice pellets")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="302"><td class="num" id="LN302">302</td><td class="line"> <span class='comment'>/* HAIL */</span> {<span class='macro'>N_(<span class='string_literal'>"Hail"</span>)<span class='macro_popup'>("Hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Hail"</span>)<span class='macro_popup'>("Hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Hailstorm"</span>)<span class='macro_popup'>("Hailstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Hail showers"</span>)<span class='macro_popup'>("Hail showers")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, },</td></tr> +<tr class="codeline" data-linenumber="303"><td class="num" id="LN303">303</td><td class="line"> <span class='comment'>/* SMALL_HAIL */</span> {<span class='macro'>N_(<span class='string_literal'>"Small hail"</span>)<span class='macro_popup'>("Small hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Small hail"</span>)<span class='macro_popup'>("Small hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Small hailstorm"</span>)<span class='macro_popup'>("Small hailstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Showers of small hail"</span>)<span class='macro_popup'>("Showers of small hail")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="304"><td class="num" id="LN304">304</td><td class="line"> <span class='comment'>/* PRECIPITATION */</span> {<span class='macro'>N_(<span class='string_literal'>"Unknown precipitation"</span>)<span class='macro_popup'>("Unknown precipitation")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="305"><td class="num" id="LN305">305</td><td class="line"> <span class='comment'>/* MIST */</span> {<span class='macro'>N_(<span class='string_literal'>"Mist"</span>)<span class='macro_popup'>("Mist")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Mist"</span>)<span class='macro_popup'>("Mist")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="306"><td class="num" id="LN306">306</td><td class="line"> <span class='comment'>/* FOG */</span> {<span class='macro'>N_(<span class='string_literal'>"Fog"</span>)<span class='macro_popup'>("Fog")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Fog in the vicinity"</span>)<span class='macro_popup'>("Fog in the vicinity")</span></span> , <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Fog"</span>)<span class='macro_popup'>("Fog")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Shallow fog"</span>)<span class='macro_popup'>("Shallow fog")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Patches of fog"</span>)<span class='macro_popup'>("Patches of fog")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Partial fog"</span>)<span class='macro_popup'>("Partial fog")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Freezing fog"</span>)<span class='macro_popup'>("Freezing fog")</span></span> },</td></tr> +<tr class="codeline" data-linenumber="307"><td class="num" id="LN307">307</td><td class="line"> <span class='comment'>/* SMOKE */</span> {<span class='macro'>N_(<span class='string_literal'>"Smoke"</span>)<span class='macro_popup'>("Smoke")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Smoke"</span>)<span class='macro_popup'>("Smoke")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="308"><td class="num" id="LN308">308</td><td class="line"> <span class='comment'>/* VOLCANIC_ASH */</span> {<span class='macro'>N_(<span class='string_literal'>"Volcanic ash"</span>)<span class='macro_popup'>("Volcanic ash")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Volcanic ash"</span>)<span class='macro_popup'>("Volcanic ash")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="309"><td class="num" id="LN309">309</td><td class="line"> <span class='comment'>/* SAND */</span> {<span class='macro'>N_(<span class='string_literal'>"Sand"</span>)<span class='macro_popup'>("Sand")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Sand"</span>)<span class='macro_popup'>("Sand")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Blowing sand"</span>)<span class='macro_popup'>("Blowing sand")</span></span>, <span class='string_literal'>""</span>, <span class='macro'>N_(<span class='string_literal'>"Drifting sand"</span>)<span class='macro_popup'>("Drifting sand")</span></span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="310"><td class="num" id="LN310">310</td><td class="line"> <span class='comment'>/* HAZE */</span> {<span class='macro'>N_(<span class='string_literal'>"Haze"</span>)<span class='macro_popup'>("Haze")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Haze"</span>)<span class='macro_popup'>("Haze")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="311"><td class="num" id="LN311">311</td><td class="line"> <span class='comment'>/* SPRAY */</span> {<span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Blowing sprays"</span>)<span class='macro_popup'>("Blowing sprays")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="312"><td class="num" id="LN312">312</td><td class="line"> <span class='comment'>/* DUST */</span> {<span class='macro'>N_(<span class='string_literal'>"Dust"</span>)<span class='macro_popup'>("Dust")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Dust"</span>)<span class='macro_popup'>("Dust")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Blowing dust"</span>)<span class='macro_popup'>("Blowing dust")</span></span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Drifting dust"</span>)<span class='macro_popup'>("Drifting dust")</span></span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="313"><td class="num" id="LN313">313</td><td class="line"> <span class='comment'>/* SQUALL */</span> {<span class='macro'>N_(<span class='string_literal'>"Squall"</span>)<span class='macro_popup'>("Squall")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Squall"</span>)<span class='macro_popup'>("Squall")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="314"><td class="num" id="LN314">314</td><td class="line"> <span class='comment'>/* SANDSTORM */</span> {<span class='macro'>N_(<span class='string_literal'>"Sandstorm"</span>)<span class='macro_popup'>("Sandstorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Sandstorm in the vicinity"</span>)<span class='macro_popup'>("Sandstorm in the vicinity")</span></span> , <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Sandstorm"</span>)<span class='macro_popup'>("Sandstorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy sandstorm"</span>)<span class='macro_popup'>("Heavy sandstorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="315"><td class="num" id="LN315">315</td><td class="line"> <span class='comment'>/* DUSTSTORM */</span> {<span class='macro'>N_(<span class='string_literal'>"Duststorm"</span>)<span class='macro_popup'>("Duststorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Duststorm in the vicinity"</span>)<span class='macro_popup'>("Duststorm in the vicinity")</span></span> , <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Duststorm"</span>)<span class='macro_popup'>("Duststorm")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Heavy duststorm"</span>)<span class='macro_popup'>("Heavy duststorm")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="316"><td class="num" id="LN316">316</td><td class="line"> <span class='comment'>/* FUNNEL_CLOUD */</span> {<span class='macro'>N_(<span class='string_literal'>"Funnel cloud"</span>)<span class='macro_popup'>("Funnel cloud")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="317"><td class="num" id="LN317">317</td><td class="line"> <span class='comment'>/* TORNADO */</span> {<span class='macro'>N_(<span class='string_literal'>"Tornado"</span>)<span class='macro_popup'>("Tornado")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> },</td></tr> +<tr class="codeline" data-linenumber="318"><td class="num" id="LN318">318</td><td class="line"> <span class='comment'>/* DUST_WHIRLS */</span> {<span class='macro'>N_(<span class='string_literal'>"Dust whirls"</span>)<span class='macro_popup'>("Dust whirls")</span></span>, <span class='macro'>N_(<span class='string_literal'>"Dust whirls in the vicinity"</span>)<span class='macro_popup'>("Dust whirls in the vicinity")</span></span> , <span class='string_literal'>"??"</span>, <span class='macro'>N_(<span class='string_literal'>"Dust whirls"</span>)<span class='macro_popup'>("Dust whirls")</span></span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span>, <span class='string_literal'>"??"</span> }</td></tr> +<tr class="codeline" data-linenumber="319"><td class="num" id="LN319">319</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="320"><td class="num" id="LN320">320</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="321"><td class="num" id="LN321">321</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="322"><td class="num" id="LN322">322</td><td class="line">weather_conditions_string (WeatherConditions cond)</td></tr> +<tr class="codeline" data-linenumber="323"><td class="num" id="LN323">323</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="324"><td class="num" id="LN324">324</td><td class="line"> <span class='keyword'>const</span> gchar *str;</td></tr> +<tr class="codeline" data-linenumber="325"><td class="num" id="LN325">325</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="326"><td class="num" id="LN326">326</td><td class="line"> <span class='keyword'>if</span> (!cond.significant) {</td></tr> +<tr class="codeline" data-linenumber="327"><td class="num" id="LN327">327</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="328"><td class="num" id="LN328">328</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="329"><td class="num" id="LN329">329</td><td class="line"> <span class='keyword'>if</span> (cond.phenomenon > PHENOMENON_INVALID &&</td></tr> +<tr class="codeline" data-linenumber="330"><td class="num" id="LN330">330</td><td class="line"> cond.phenomenon < PHENOMENON_LAST &&</td></tr> +<tr class="codeline" data-linenumber="331"><td class="num" id="LN331">331</td><td class="line"> cond.qualifier > QUALIFIER_INVALID &&</td></tr> +<tr class="codeline" data-linenumber="332"><td class="num" id="LN332">332</td><td class="line"> cond.qualifier < QUALIFIER_LAST)</td></tr> +<tr class="codeline" data-linenumber="333"><td class="num" id="LN333">333</td><td class="line"> str = <span class='macro'>_(conditions_str[(<span class='keyword'>int</span>)cond.phenomenon][(<span class='keyword'>int</span>)cond.qualifier])<span class='macro_popup'>(mateweather_gettext (conditions_str[(int)cond.phenomenon][(int<br>)cond.qualifier]))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="334"><td class="num" id="LN334">334</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="335"><td class="num" id="LN335">335</td><td class="line"> str = <span class='macro'>_(<span class='string_literal'>"Invalid"</span>)<span class='macro_popup'>(mateweather_gettext ("Invalid"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="336"><td class="num" id="LN336">336</td><td class="line"> <span class='keyword'>return</span> (strlen (str) > 0) ? str : <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="337"><td class="num" id="LN337">337</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="338"><td class="num" id="LN338">338</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="339"><td class="num" id="LN339">339</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="340"><td class="num" id="LN340">340</td><td class="line"><span class='comment'>/* Locals turned global to facilitate asynchronous HTTP requests */</span></td></tr> +<tr class="codeline" data-linenumber="341"><td class="num" id="LN341">341</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="342"><td class="num" id="LN342">342</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="343"><td class="num" id="LN343">343</td><td class="line">requests_init (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="344"><td class="num" id="LN344">344</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="345"><td class="num" id="LN345">345</td><td class="line"> <span class='keyword'>if</span> (info->requests_pending)</td></tr> +<tr class="codeline" data-linenumber="346"><td class="num" id="LN346">346</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="347"><td class="num" id="LN347">347</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="348"><td class="num" id="LN348">348</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="349"><td class="num" id="LN349">349</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="350"><td class="num" id="LN350">350</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="351"><td class="num" id="LN351">351</td><td class="line"><span class='keyword'>void</span> request_done (WeatherInfo *info, gboolean ok)</td></tr> +<tr class="codeline" data-linenumber="352"><td class="num" id="LN352">352</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="353"><td class="num" id="LN353">353</td><td class="line"> <span class='keyword'>if</span> (ok) {</td></tr> +<tr class="codeline" data-linenumber="354"><td class="num" id="LN354">354</td><td class="line"> (<span class='keyword'>void</span>) calc_sun (info);</td></tr> +<tr class="codeline" data-linenumber="355"><td class="num" id="LN355">355</td><td class="line"> info->moonValid = info->valid && calc_moon (info);</td></tr> +<tr class="codeline" data-linenumber="356"><td class="num" id="LN356">356</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="357"><td class="num" id="LN357">357</td><td class="line"> <span class='keyword'>if</span> (!--info->requests_pending)</td></tr> +<tr class="codeline" data-linenumber="358"><td class="num" id="LN358">358</td><td class="line"> info->finish_cb (info, info->cb_data);</td></tr> +<tr class="codeline" data-linenumber="359"><td class="num" id="LN359">359</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="360"><td class="num" id="LN360">360</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="361"><td class="num" id="LN361">361</td><td class="line"><span class='comment'>/* it's OK to pass in NULL */</span></td></tr> +<tr class="codeline" data-linenumber="362"><td class="num" id="LN362">362</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="363"><td class="num" id="LN363">363</td><td class="line">free_forecast_list (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="364"><td class="num" id="LN364">364</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="365"><td class="num" id="LN365">365</td><td class="line"> GSList *p;</td></tr> +<tr class="codeline" data-linenumber="366"><td class="num" id="LN366">366</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="367"><td class="num" id="LN367">367</td><td class="line"> <span class='keyword'>if</span> (!info)</td></tr> +<tr class="codeline" data-linenumber="368"><td class="num" id="LN368">368</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="369"><td class="num" id="LN369">369</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="370"><td class="num" id="LN370">370</td><td class="line"> <span class='keyword'>for</span> (p = info->forecast_list; p; p = p->next)</td></tr> +<tr class="codeline" data-linenumber="371"><td class="num" id="LN371">371</td><td class="line"> weather_info_free (p->data);</td></tr> +<tr class="codeline" data-linenumber="372"><td class="num" id="LN372">372</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="373"><td class="num" id="LN373">373</td><td class="line"> <span class='keyword'>if</span> (info->forecast_list) {</td></tr> +<tr class="codeline" data-linenumber="374"><td class="num" id="LN374">374</td><td class="line"> g_slist_free (info->forecast_list);</td></tr> +<tr class="codeline" data-linenumber="375"><td class="num" id="LN375">375</td><td class="line"> info->forecast_list = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="376"><td class="num" id="LN376">376</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="377"><td class="num" id="LN377">377</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="378"><td class="num" id="LN378">378</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="379"><td class="num" id="LN379">379</td><td class="line"><span class='comment'>/* Relative humidity computation - thanks to <[email protected]> */</span></td></tr> +<tr class="codeline" data-linenumber="380"><td class="num" id="LN380">380</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="381"><td class="num" id="LN381">381</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>inline</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="382"><td class="num" id="LN382">382</td><td class="line">calc_humidity (gdouble temp, gdouble dewp)</td></tr> +<tr class="codeline" data-linenumber="383"><td class="num" id="LN383">383</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="384"><td class="num" id="LN384">384</td><td class="line"> gdouble esat, esurf;</td></tr> +<tr class="codeline" data-linenumber="385"><td class="num" id="LN385">385</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="386"><td class="num" id="LN386">386</td><td class="line"> <span class='keyword'>if</span> (temp > -500.0 && dewp > -500.0) {</td></tr> +<tr class="codeline" data-linenumber="387"><td class="num" id="LN387">387</td><td class="line"> temp = <span class='macro'>TEMP_F_TO_C (temp)<span class='macro_popup'>(((temp) - 32.0) * (5.0/9.0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="388"><td class="num" id="LN388">388</td><td class="line"> dewp = <span class='macro'>TEMP_F_TO_C (dewp)<span class='macro_popup'>(((dewp) - 32.0) * (5.0/9.0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="389"><td class="num" id="LN389">389</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="390"><td class="num" id="LN390">390</td><td class="line"> esat = 6.11 * pow (10.0, (7.5 * temp) / (237.7 + temp));</td></tr> +<tr class="codeline" data-linenumber="391"><td class="num" id="LN391">391</td><td class="line"> esurf = 6.11 * pow (10.0, (7.5 * dewp) / (237.7 + dewp));</td></tr> +<tr class="codeline" data-linenumber="392"><td class="num" id="LN392">392</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="393"><td class="num" id="LN393">393</td><td class="line"> esurf = -1.0;</td></tr> +<tr class="codeline" data-linenumber="394"><td class="num" id="LN394">394</td><td class="line"> esat = 1.0;</td></tr> +<tr class="codeline" data-linenumber="395"><td class="num" id="LN395">395</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="396"><td class="num" id="LN396">396</td><td class="line"> <span class='keyword'>return</span> ((esurf/esat) * 100.0);</td></tr> +<tr class="codeline" data-linenumber="397"><td class="num" id="LN397">397</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="398"><td class="num" id="LN398">398</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="399"><td class="num" id="LN399">399</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>inline</span> gdouble</td></tr> +<tr class="codeline" data-linenumber="400"><td class="num" id="LN400">400</td><td class="line">calc_apparent (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="401"><td class="num" id="LN401">401</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="402"><td class="num" id="LN402">402</td><td class="line"> gdouble temp = info->temp;</td></tr> +<tr class="codeline" data-linenumber="403"><td class="num" id="LN403">403</td><td class="line"> gdouble wind = <span class='macro'>WINDSPEED_KNOTS_TO_MPH (info->windspeed)<span class='macro_popup'>((info->windspeed) * 1.150779)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="404"><td class="num" id="LN404">404</td><td class="line"> gdouble apparent = -1000.;</td></tr> +<tr class="codeline" data-linenumber="405"><td class="num" id="LN405">405</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="406"><td class="num" id="LN406">406</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="407"><td class="num" id="LN407">407</td><td class="line"> <span class='comment'>* Wind chill calculations as of 01-Nov-2001</span></td></tr> +<tr class="codeline" data-linenumber="408"><td class="num" id="LN408">408</td><td class="line"> <span class='comment'>* http://www.nws.noaa.gov/om/windchill/index.shtml</span></td></tr> +<tr class="codeline" data-linenumber="409"><td class="num" id="LN409">409</td><td class="line"> <span class='comment'>* Some pages suggest that the formula will soon be adjusted</span></td></tr> +<tr class="codeline" data-linenumber="410"><td class="num" id="LN410">410</td><td class="line"> <span class='comment'>* to account for solar radiation (bright sun vs cloudy sky)</span></td></tr> +<tr class="codeline" data-linenumber="411"><td class="num" id="LN411">411</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="412"><td class="num" id="LN412">412</td><td class="line"> <span class='keyword'>if</span> (temp <= 50.0) {</td></tr> +<tr class="codeline" data-linenumber="413"><td class="num" id="LN413">413</td><td class="line"> <span class='keyword'>if</span> (wind > 3.0) {</td></tr> +<tr class="codeline" data-linenumber="414"><td class="num" id="LN414">414</td><td class="line"> gdouble v = pow (wind, 0.16);</td></tr> +<tr class="codeline" data-linenumber="415"><td class="num" id="LN415">415</td><td class="line"> apparent = 35.74 + 0.6215 * temp - 35.75 * v + 0.4275 * temp * v;</td></tr> +<tr class="codeline" data-linenumber="416"><td class="num" id="LN416">416</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (wind >= 0.) {</td></tr> +<tr class="codeline" data-linenumber="417"><td class="num" id="LN417">417</td><td class="line"> apparent = temp;</td></tr> +<tr class="codeline" data-linenumber="418"><td class="num" id="LN418">418</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="419"><td class="num" id="LN419">419</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="420"><td class="num" id="LN420">420</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="421"><td class="num" id="LN421">421</td><td class="line"> <span class='comment'>* Heat index calculations:</span></td></tr> +<tr class="codeline" data-linenumber="422"><td class="num" id="LN422">422</td><td class="line"> <span class='comment'>* http://www.srh.noaa.gov/fwd/heatindex/heat5.html</span></td></tr> +<tr class="codeline" data-linenumber="423"><td class="num" id="LN423">423</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="424"><td class="num" id="LN424">424</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (temp >= 80.0) {</td></tr> +<tr class="codeline" data-linenumber="425"><td class="num" id="LN425">425</td><td class="line"> <span class='keyword'>if</span> (info->temp >= -500. && info->dew >= -500.) {</td></tr> +<tr class="codeline" data-linenumber="426"><td class="num" id="LN426">426</td><td class="line"> gdouble humidity = calc_humidity (info->temp, info->dew);</td></tr> +<tr class="codeline" data-linenumber="427"><td class="num" id="LN427">427</td><td class="line"> gdouble t2 = temp * temp;</td></tr> +<tr class="codeline" data-linenumber="428"><td class="num" id="LN428">428</td><td class="line"> gdouble h2 = humidity * humidity;</td></tr> +<tr class="codeline" data-linenumber="429"><td class="num" id="LN429">429</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="430"><td class="num" id="LN430">430</td><td class="line"><span class='directive'>#if 1</span></td></tr> +<tr class="codeline" data-linenumber="431"><td class="num" id="LN431">431</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="432"><td class="num" id="LN432">432</td><td class="line"> <span class='comment'>* A really precise formula. Note that overall precision is</span></td></tr> +<tr class="codeline" data-linenumber="433"><td class="num" id="LN433">433</td><td class="line"> <span class='comment'>* constrained by the accuracy of the instruments and that the</span></td></tr> +<tr class="codeline" data-linenumber="434"><td class="num" id="LN434">434</td><td class="line"> <span class='comment'>* we receive the temperature and dewpoints as integers.</span></td></tr> +<tr class="codeline" data-linenumber="435"><td class="num" id="LN435">435</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="436"><td class="num" id="LN436">436</td><td class="line"> gdouble t3 = t2 * temp;</td></tr> +<tr class="codeline" data-linenumber="437"><td class="num" id="LN437">437</td><td class="line"> gdouble h3 = h2 * temp;</td></tr> +<tr class="codeline" data-linenumber="438"><td class="num" id="LN438">438</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="439"><td class="num" id="LN439">439</td><td class="line"> apparent = 16.923</td></tr> +<tr class="codeline" data-linenumber="440"><td class="num" id="LN440">440</td><td class="line"> + 0.185212 * temp</td></tr> +<tr class="codeline" data-linenumber="441"><td class="num" id="LN441">441</td><td class="line"> + 5.37941 * humidity</td></tr> +<tr class="codeline" data-linenumber="442"><td class="num" id="LN442">442</td><td class="line"> - 0.100254 * temp * humidity</td></tr> +<tr class="codeline" data-linenumber="443"><td class="num" id="LN443">443</td><td class="line"> + 9.41695e-3 * t2</td></tr> +<tr class="codeline" data-linenumber="444"><td class="num" id="LN444">444</td><td class="line"> + 7.28898e-3 * h2</td></tr> +<tr class="codeline" data-linenumber="445"><td class="num" id="LN445">445</td><td class="line"> + 3.45372e-4 * t2 * humidity</td></tr> +<tr class="codeline" data-linenumber="446"><td class="num" id="LN446">446</td><td class="line"> - 8.14971e-4 * temp * h2</td></tr> +<tr class="codeline" data-linenumber="447"><td class="num" id="LN447">447</td><td class="line"> + 1.02102e-5 * t2 * h2</td></tr> +<tr class="codeline" data-linenumber="448"><td class="num" id="LN448">448</td><td class="line"> - 3.8646e-5 * t3</td></tr> +<tr class="codeline" data-linenumber="449"><td class="num" id="LN449">449</td><td class="line"> + 2.91583e-5 * h3</td></tr> +<tr class="codeline" data-linenumber="450"><td class="num" id="LN450">450</td><td class="line"> + 1.42721e-6 * t3 * humidity</td></tr> +<tr class="codeline" data-linenumber="451"><td class="num" id="LN451">451</td><td class="line"> + 1.97483e-7 * temp * h3</td></tr> +<tr class="codeline" data-linenumber="452"><td class="num" id="LN452">452</td><td class="line"> - 2.18429e-8 * t3 * h2</td></tr> +<tr class="codeline" data-linenumber="453"><td class="num" id="LN453">453</td><td class="line"> + 8.43296e-10 * t2 * h3</td></tr> +<tr class="codeline" data-linenumber="454"><td class="num" id="LN454">454</td><td class="line"> - 4.81975e-11 * t3 * h3;</td></tr> +<tr class="codeline" data-linenumber="455"><td class="num" id="LN455">455</td><td class="line"><span class='directive'>#else</span></td></tr> +<tr class="codeline" data-linenumber="456"><td class="num" id="LN456">456</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="457"><td class="num" id="LN457">457</td><td class="line"> <span class='comment'>* An often cited alternative: values are within 5 degrees for</span></td></tr> +<tr class="codeline" data-linenumber="458"><td class="num" id="LN458">458</td><td class="line"> <span class='comment'>* most ranges between 10% and 70% humidity and to 110 degrees.</span></td></tr> +<tr class="codeline" data-linenumber="459"><td class="num" id="LN459">459</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="460"><td class="num" id="LN460">460</td><td class="line"> apparent = - 42.379</td></tr> +<tr class="codeline" data-linenumber="461"><td class="num" id="LN461">461</td><td class="line"> + 2.04901523 * temp</td></tr> +<tr class="codeline" data-linenumber="462"><td class="num" id="LN462">462</td><td class="line"> + 10.14333127 * humidity</td></tr> +<tr class="codeline" data-linenumber="463"><td class="num" id="LN463">463</td><td class="line"> - 0.22475541 * temp * humidity</td></tr> +<tr class="codeline" data-linenumber="464"><td class="num" id="LN464">464</td><td class="line"> - 6.83783e-3 * t2</td></tr> +<tr class="codeline" data-linenumber="465"><td class="num" id="LN465">465</td><td class="line"> - 5.481717e-2 * h2</td></tr> +<tr class="codeline" data-linenumber="466"><td class="num" id="LN466">466</td><td class="line"> + 1.22874e-3 * t2 * humidity</td></tr> +<tr class="codeline" data-linenumber="467"><td class="num" id="LN467">467</td><td class="line"> + 8.5282e-4 * temp * h2</td></tr> +<tr class="codeline" data-linenumber="468"><td class="num" id="LN468">468</td><td class="line"> - 1.99e-6 * t2 * h2;</td></tr> +<tr class="codeline" data-linenumber="469"><td class="num" id="LN469">469</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="470"><td class="num" id="LN470">470</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="471"><td class="num" id="LN471">471</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="472"><td class="num" id="LN472">472</td><td class="line"> apparent = temp;</td></tr> +<tr class="codeline" data-linenumber="473"><td class="num" id="LN473">473</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="474"><td class="num" id="LN474">474</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="475"><td class="num" id="LN475">475</td><td class="line"> <span class='keyword'>return</span> apparent;</td></tr> +<tr class="codeline" data-linenumber="476"><td class="num" id="LN476">476</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="477"><td class="num" id="LN477">477</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="478"><td class="num" id="LN478">478</td><td class="line">WeatherInfo *</td></tr> +<tr class="codeline" data-linenumber="479"><td class="num" id="LN479">479</td><td class="line">_weather_info_fill (WeatherInfo *info,</td></tr> +<tr class="codeline" data-linenumber="480"><td class="num" id="LN480">480</td><td class="line"> WeatherLocation *location,</td></tr> +<tr class="codeline" data-linenumber="481"><td class="num" id="LN481">481</td><td class="line"> <span class='keyword'>const</span> WeatherPrefs *prefs,</td></tr> +<tr class="codeline" data-linenumber="482"><td class="num" id="LN482">482</td><td class="line"> WeatherInfoFunc cb,</td></tr> +<tr class="codeline" data-linenumber="483"><td class="num" id="LN483">483</td><td class="line"> gpointer data)</td></tr> +<tr class="codeline" data-linenumber="484"><td class="num" id="LN484">484</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="485"><td class="num" id="LN485">485</td><td class="line"> <span class='macro'>g_return_val_if_fail (((info == NULL) && (location != NULL)) || \<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_150<br>; if (((info == ((void*)0)) && (location != ((void*)0<br>))) || ((info != ((void*)0)) && (location == ((void*)<br>0)))) _g_boolean_var_150 = 1; else _g_boolean_var_150 = 0; _g_boolean_var_150<br>; }), 1))) { } else { g_return_if_fail_warning ("MateWeather"<br>, ((const char*) (__func__)), "((info == NULL) && (location != NULL)) || ((info != NULL) && (location == NULL))"<br>); return (((void*)0)); } } while (0)</span></span></td></tr> +<tr class="codeline" data-linenumber="486"><td class="num" id="LN486">486</td><td class="line"> <span class='macro'>((info != NULL) && (location == NULL)), NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_150<br>; if (((info == ((void*)0)) && (location != ((void*)0<br>))) || ((info != ((void*)0)) && (location == ((void*)<br>0)))) _g_boolean_var_150 = 1; else _g_boolean_var_150 = 0; _g_boolean_var_150<br>; }), 1))) { } else { g_return_if_fail_warning ("MateWeather"<br>, ((const char*) (__func__)), "((info == NULL) && (location != NULL)) || ((info != NULL) && (location == NULL))"<br>); return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="487"><td class="num" id="LN487">487</td><td class="line"> <span class='macro'>g_return_val_if_fail (prefs != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_151<br>; if (prefs != ((void*)0)) _g_boolean_var_151 = 1; else _g_boolean_var_151<br> = 0; _g_boolean_var_151; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "prefs != NULL")<br>; return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="488"><td class="num" id="LN488">488</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="489"><td class="num" id="LN489">489</td><td class="line"> <span class='comment'>/* FIXME: i'm not sure this works as intended anymore */</span></td></tr> +<tr class="codeline" data-linenumber="490"><td class="num" id="LN490">490</td><td class="line"> <span class='keyword'>if</span> (!info) {</td></tr> +<tr class="codeline" data-linenumber="491"><td class="num" id="LN491">491</td><td class="line"> info = <span class='macro'>g_new0 (WeatherInfo, 1)<span class='macro_popup'>(WeatherInfo *) (__extension__ ({ gsize __n = (gsize) (1); gsize<br> __s = sizeof (WeatherInfo); gpointer __p; if (__s == 1) __p =<br> g_malloc0 (__n); else if (__builtin_constant_p (__n) &&<br> (__s == 0 || __n <= (9223372036854775807L *2UL+1UL) / __s<br>)) __p = g_malloc0 (__n * __s); else __p = g_malloc0_n (__n, __s<br>); __p; }))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="492"><td class="num" id="LN492">492</td><td class="line"> info->requests_pending = 0;</td></tr> +<tr class="codeline" data-linenumber="493"><td class="num" id="LN493">493</td><td class="line"> info->location = weather_location_clone (location);</td></tr> +<tr class="codeline" data-linenumber="494"><td class="num" id="LN494">494</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="495"><td class="num" id="LN495">495</td><td class="line"> location = info->location;</td></tr> +<tr class="codeline" data-linenumber="496"><td class="num" id="LN496">496</td><td class="line"> <span class='keyword'>if</span> (info->forecast)</td></tr> +<tr class="codeline" data-linenumber="497"><td class="num" id="LN497">497</td><td class="line"> g_free (info->forecast);</td></tr> +<tr class="codeline" data-linenumber="498"><td class="num" id="LN498">498</td><td class="line"> info->forecast = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="499"><td class="num" id="LN499">499</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="500"><td class="num" id="LN500">500</td><td class="line"> free_forecast_list (info);</td></tr> +<tr class="codeline" data-linenumber="501"><td class="num" id="LN501">501</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="502"><td class="num" id="LN502">502</td><td class="line"> <span class='keyword'>if</span> (info->radar != <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="503"><td class="num" id="LN503">503</td><td class="line"> g_object_unref (info->radar);</td></tr> +<tr class="codeline" data-linenumber="504"><td class="num" id="LN504">504</td><td class="line"> info->radar = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="505"><td class="num" id="LN505">505</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="506"><td class="num" id="LN506">506</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="507"><td class="num" id="LN507">507</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="508"><td class="num" id="LN508">508</td><td class="line"> <span class='comment'>/* Update in progress */</span></td></tr> +<tr class="codeline" data-linenumber="509"><td class="num" id="LN509">509</td><td class="line"> <span class='keyword'>if</span> (!requests_init (info)) {</td></tr> +<tr class="codeline" data-linenumber="510"><td class="num" id="LN510">510</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="511"><td class="num" id="LN511">511</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="512"><td class="num" id="LN512">512</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="513"><td class="num" id="LN513">513</td><td class="line"> <span class='comment'>/* Defaults (just in case...) */</span></td></tr> +<tr class="codeline" data-linenumber="514"><td class="num" id="LN514">514</td><td class="line"> <span class='comment'>/* Well, no just in case anymore. We may actually fail to fetch some</span></td></tr> +<tr class="codeline" data-linenumber="515"><td class="num" id="LN515">515</td><td class="line"> <span class='comment'>* fields. */</span></td></tr> +<tr class="codeline" data-linenumber="516"><td class="num" id="LN516">516</td><td class="line"> info->forecast_type = prefs->type;</td></tr> +<tr class="codeline" data-linenumber="517"><td class="num" id="LN517">517</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="518"><td class="num" id="LN518">518</td><td class="line"> info->temperature_unit = prefs->temperature_unit;</td></tr> +<tr class="codeline" data-linenumber="519"><td class="num" id="LN519">519</td><td class="line"> info->speed_unit = prefs->speed_unit;</td></tr> +<tr class="codeline" data-linenumber="520"><td class="num" id="LN520">520</td><td class="line"> info->pressure_unit = prefs->pressure_unit;</td></tr> +<tr class="codeline" data-linenumber="521"><td class="num" id="LN521">521</td><td class="line"> info->distance_unit = prefs->distance_unit;</td></tr> +<tr class="codeline" data-linenumber="522"><td class="num" id="LN522">522</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="523"><td class="num" id="LN523">523</td><td class="line"> info->update = 0;</td></tr> +<tr class="codeline" data-linenumber="524"><td class="num" id="LN524">524</td><td class="line"> info->sky = -1;</td></tr> +<tr class="codeline" data-linenumber="525"><td class="num" id="LN525">525</td><td class="line"> info->cond.significant = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="526"><td class="num" id="LN526">526</td><td class="line"> info->cond.phenomenon = PHENOMENON_NONE;</td></tr> +<tr class="codeline" data-linenumber="527"><td class="num" id="LN527">527</td><td class="line"> info->cond.qualifier = QUALIFIER_NONE;</td></tr> +<tr class="codeline" data-linenumber="528"><td class="num" id="LN528">528</td><td class="line"> info->temp = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="529"><td class="num" id="LN529">529</td><td class="line"> info->tempMinMaxValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="530"><td class="num" id="LN530">530</td><td class="line"> info->temp_min = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="531"><td class="num" id="LN531">531</td><td class="line"> info->temp_max = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="532"><td class="num" id="LN532">532</td><td class="line"> info->dew = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="533"><td class="num" id="LN533">533</td><td class="line"> info->wind = -1;</td></tr> +<tr class="codeline" data-linenumber="534"><td class="num" id="LN534">534</td><td class="line"> info->windspeed = -1;</td></tr> +<tr class="codeline" data-linenumber="535"><td class="num" id="LN535">535</td><td class="line"> info->pressure = -1.0;</td></tr> +<tr class="codeline" data-linenumber="536"><td class="num" id="LN536">536</td><td class="line"> info->visibility = -1.0;</td></tr> +<tr class="codeline" data-linenumber="537"><td class="num" id="LN537">537</td><td class="line"> info->sunriseValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="538"><td class="num" id="LN538">538</td><td class="line"> info->sunsetValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="539"><td class="num" id="LN539">539</td><td class="line"> info->moonValid = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="540"><td class="num" id="LN540">540</td><td class="line"> info->sunrise = 0;</td></tr> +<tr class="codeline" data-linenumber="541"><td class="num" id="LN541">541</td><td class="line"> info->sunset = 0;</td></tr> +<tr class="codeline" data-linenumber="542"><td class="num" id="LN542">542</td><td class="line"> info->moonphase = 0;</td></tr> +<tr class="codeline" data-linenumber="543"><td class="num" id="LN543">543</td><td class="line"> info->moonlatitude = 0;</td></tr> +<tr class="codeline" data-linenumber="544"><td class="num" id="LN544">544</td><td class="line"> info->forecast = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="545"><td class="num" id="LN545">545</td><td class="line"> info->forecast_list = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="546"><td class="num" id="LN546">546</td><td class="line"> info->radar = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="547"><td class="num" id="LN547">547</td><td class="line"> info->radar_url = prefs->radar && prefs->radar_custom_url ?</td></tr> +<tr class="codeline" data-linenumber="548"><td class="num" id="LN548">548</td><td class="line"> <span class='macro'>g_strdup (prefs->radar_custom_url)<span class='macro_popup'>g_strdup_inline (prefs->radar_custom_url)</span></span> : <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="549"><td class="num" id="LN549">549</td><td class="line"> info->finish_cb = cb;</td></tr> +<tr class="codeline" data-linenumber="550"><td class="num" id="LN550">550</td><td class="line"> info->cb_data = data;</td></tr> +<tr class="codeline" data-linenumber="551"><td class="num" id="LN551">551</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="552"><td class="num" id="LN552">552</td><td class="line"> <span class='keyword'>if</span> (!info->session) {</td></tr> +<tr class="codeline" data-linenumber="553"><td class="num" id="LN553">553</td><td class="line"> info->session = soup_session_new ();</td></tr> +<tr class="codeline" data-linenumber="554"><td class="num" id="LN554">554</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="555"><td class="num" id="LN555">555</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="556"><td class="num" id="LN556">556</td><td class="line"> metar_start_open (info);</td></tr> +<tr class="codeline" data-linenumber="557"><td class="num" id="LN557">557</td><td class="line"> iwin_start_open (info);</td></tr> +<tr class="codeline" data-linenumber="558"><td class="num" id="LN558">558</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="559"><td class="num" id="LN559">559</td><td class="line"> <span class='keyword'>if</span> (prefs->radar) {</td></tr> +<tr class="codeline" data-linenumber="560"><td class="num" id="LN560">560</td><td class="line"> wx_start_open (info);</td></tr> +<tr class="codeline" data-linenumber="561"><td class="num" id="LN561">561</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="562"><td class="num" id="LN562">562</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="563"><td class="num" id="LN563">563</td><td class="line"> <span class='keyword'>return</span> info;</td></tr> +<tr class="codeline" data-linenumber="564"><td class="num" id="LN564">564</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="565"><td class="num" id="LN565">565</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="566"><td class="num" id="LN566">566</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="567"><td class="num" id="LN567">567</td><td class="line">weather_info_abort (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="568"><td class="num" id="LN568">568</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="569"><td class="num" id="LN569">569</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_152<br>; if (info != ((void*)0)) _g_boolean_var_152 = 1; else _g_boolean_var_152<br> = 0; _g_boolean_var_152; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="570"><td class="num" id="LN570">570</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="571"><td class="num" id="LN571">571</td><td class="line"> <span class='keyword'>if</span> (info->session) {</td></tr> +<tr class="codeline" data-linenumber="572"><td class="num" id="LN572">572</td><td class="line"> soup_session_abort (info->session);</td></tr> +<tr class="codeline" data-linenumber="573"><td class="num" id="LN573">573</td><td class="line"> info->requests_pending = 0;</td></tr> +<tr class="codeline" data-linenumber="574"><td class="num" id="LN574">574</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="575"><td class="num" id="LN575">575</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="576"><td class="num" id="LN576">576</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="577"><td class="num" id="LN577">577</td><td class="line">WeatherInfo *</td></tr> +<tr class="codeline" data-linenumber="578"><td class="num" id="LN578">578</td><td class="line">weather_info_clone (<span class='keyword'>const</span> WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="579"><td class="num" id="LN579">579</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="580"><td class="num" id="LN580">580</td><td class="line"> WeatherInfo *clone;</td></tr> +<tr class="codeline" data-linenumber="581"><td class="num" id="LN581">581</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="582"><td class="num" id="LN582">582</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_153<br>; if (info != ((void*)0)) _g_boolean_var_153 = 1; else _g_boolean_var_153<br> = 0; _g_boolean_var_153; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="583"><td class="num" id="LN583">583</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="584"><td class="num" id="LN584">584</td><td class="line"> clone = <span class='macro'>g_new (WeatherInfo, 1)<span class='macro_popup'>(WeatherInfo *) (__extension__ ({ gsize __n = (gsize) (1); gsize<br> __s = sizeof (WeatherInfo); gpointer __p; if (__s == 1) __p =<br> g_malloc (__n); else if (__builtin_constant_p (__n) &&<br> (__s == 0 || __n <= (9223372036854775807L *2UL+1UL) / __s<br>)) __p = g_malloc (__n * __s); else __p = g_malloc_n (__n, __s<br>); __p; }))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="585"><td class="num" id="LN585">585</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="586"><td class="num" id="LN586">586</td><td class="line"> <span class='comment'>/* move everything */</span></td></tr> +<tr class="codeline" data-linenumber="587"><td class="num" id="LN587">587</td><td class="line"> memmove (clone, info, <span class='keyword'>sizeof</span> (WeatherInfo));</td></tr> +<tr class="codeline" data-linenumber="588"><td class="num" id="LN588">588</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="589"><td class="num" id="LN589">589</td><td class="line"> <span class='comment'>/* special moves */</span></td></tr> +<tr class="codeline" data-linenumber="590"><td class="num" id="LN590">590</td><td class="line"> clone->location = weather_location_clone (info->location);</td></tr> +<tr class="codeline" data-linenumber="591"><td class="num" id="LN591">591</td><td class="line"> <span class='comment'>/* This handles null correctly */</span></td></tr> +<tr class="codeline" data-linenumber="592"><td class="num" id="LN592">592</td><td class="line"> clone->forecast = <span class='macro'>g_strdup (info->forecast)<span class='macro_popup'>g_strdup_inline (info->forecast)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="593"><td class="num" id="LN593">593</td><td class="line"> clone->radar_url = <span class='macro'>g_strdup (info->radar_url)<span class='macro_popup'>g_strdup_inline (info->radar_url)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="594"><td class="num" id="LN594">594</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="595"><td class="num" id="LN595">595</td><td class="line"> <span class='keyword'>if</span> (info->forecast_list) {</td></tr> +<tr class="codeline" data-linenumber="596"><td class="num" id="LN596">596</td><td class="line"> GSList *p;</td></tr> +<tr class="codeline" data-linenumber="597"><td class="num" id="LN597">597</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="598"><td class="num" id="LN598">598</td><td class="line"> clone->forecast_list = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="599"><td class="num" id="LN599">599</td><td class="line"> <span class='keyword'>for</span> (p = info->forecast_list; p; p = p->next) {</td></tr> +<tr class="codeline" data-linenumber="600"><td class="num" id="LN600">600</td><td class="line"> clone->forecast_list = g_slist_prepend (clone->forecast_list, weather_info_clone (p->data));</td></tr> +<tr class="codeline" data-linenumber="601"><td class="num" id="LN601">601</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="602"><td class="num" id="LN602">602</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="603"><td class="num" id="LN603">603</td><td class="line"> clone->forecast_list = g_slist_reverse (clone->forecast_list);</td></tr> +<tr class="codeline" data-linenumber="604"><td class="num" id="LN604">604</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="605"><td class="num" id="LN605">605</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="606"><td class="num" id="LN606">606</td><td class="line"> clone->radar = info->radar;</td></tr> +<tr class="codeline" data-linenumber="607"><td class="num" id="LN607">607</td><td class="line"> <span class='keyword'>if</span> (clone->radar != <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="608"><td class="num" id="LN608">608</td><td class="line"> <span class='macro'>g_object_ref (clone->radar)<span class='macro_popup'>((__typeof__ (clone->radar)) (g_object_ref) (clone->radar<br>))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="609"><td class="num" id="LN609">609</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="610"><td class="num" id="LN610">610</td><td class="line"> <span class='keyword'>return</span> clone;</td></tr> +<tr class="codeline" data-linenumber="611"><td class="num" id="LN611">611</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="612"><td class="num" id="LN612">612</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="613"><td class="num" id="LN613">613</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="614"><td class="num" id="LN614">614</td><td class="line">weather_info_free (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="615"><td class="num" id="LN615">615</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="616"><td class="num" id="LN616">616</td><td class="line"> <span class='keyword'>if</span> (!info)</td></tr> +<tr class="codeline" data-linenumber="617"><td class="num" id="LN617">617</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="618"><td class="num" id="LN618">618</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="619"><td class="num" id="LN619">619</td><td class="line"> weather_info_abort (info);</td></tr> +<tr class="codeline" data-linenumber="620"><td class="num" id="LN620">620</td><td class="line"> <span class='keyword'>if</span> (info->session)</td></tr> +<tr class="codeline" data-linenumber="621"><td class="num" id="LN621">621</td><td class="line"> g_object_unref (info->session);</td></tr> +<tr class="codeline" data-linenumber="622"><td class="num" id="LN622">622</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="623"><td class="num" id="LN623">623</td><td class="line"> weather_location_free (info->location);</td></tr> +<tr class="codeline" data-linenumber="624"><td class="num" id="LN624">624</td><td class="line"> info->location = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="625"><td class="num" id="LN625">625</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="626"><td class="num" id="LN626">626</td><td class="line"> g_free (info->forecast);</td></tr> +<tr class="codeline" data-linenumber="627"><td class="num" id="LN627">627</td><td class="line"> info->forecast = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="628"><td class="num" id="LN628">628</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="629"><td class="num" id="LN629">629</td><td class="line"> free_forecast_list (info);</td></tr> +<tr class="codeline" data-linenumber="630"><td class="num" id="LN630">630</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="631"><td class="num" id="LN631">631</td><td class="line"> <span class='keyword'>if</span> (info->radar != <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="632"><td class="num" id="LN632">632</td><td class="line"> g_object_unref (info->radar);</td></tr> +<tr class="codeline" data-linenumber="633"><td class="num" id="LN633">633</td><td class="line"> info->radar = <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="634"><td class="num" id="LN634">634</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="635"><td class="num" id="LN635">635</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="636"><td class="num" id="LN636">636</td><td class="line"> g_free (info);</td></tr> +<tr class="codeline" data-linenumber="637"><td class="num" id="LN637">637</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="638"><td class="num" id="LN638">638</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="639"><td class="num" id="LN639">639</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="640"><td class="num" id="LN640">640</td><td class="line">weather_info_is_valid (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="641"><td class="num" id="LN641">641</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="642"><td class="num" id="LN642">642</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_154<br>; if (info != ((void*)0)) _g_boolean_var_154 = 1; else _g_boolean_var_154<br> = 0; _g_boolean_var_154; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="643"><td class="num" id="LN643">643</td><td class="line"> <span class='keyword'>return</span> info->valid;</td></tr> +<tr class="codeline" data-linenumber="644"><td class="num" id="LN644">644</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="645"><td class="num" id="LN645">645</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="646"><td class="num" id="LN646">646</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="647"><td class="num" id="LN647">647</td><td class="line">weather_info_network_error (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="648"><td class="num" id="LN648">648</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="649"><td class="num" id="LN649">649</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_155<br>; if (info != ((void*)0)) _g_boolean_var_155 = 1; else _g_boolean_var_155<br> = 0; _g_boolean_var_155; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="650"><td class="num" id="LN650">650</td><td class="line"> <span class='keyword'>return</span> info->network_error;</td></tr> +<tr class="codeline" data-linenumber="651"><td class="num" id="LN651">651</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="652"><td class="num" id="LN652">652</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="653"><td class="num" id="LN653">653</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="654"><td class="num" id="LN654">654</td><td class="line">weather_info_to_metric (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="655"><td class="num" id="LN655">655</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="656"><td class="num" id="LN656">656</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_156<br>; if (info != ((void*)0)) _g_boolean_var_156 = 1; else _g_boolean_var_156<br> = 0; _g_boolean_var_156; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="657"><td class="num" id="LN657">657</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="658"><td class="num" id="LN658">658</td><td class="line"> info->temperature_unit = TEMP_UNIT_CENTIGRADE;</td></tr> +<tr class="codeline" data-linenumber="659"><td class="num" id="LN659">659</td><td class="line"> info->speed_unit = SPEED_UNIT_MS;</td></tr> +<tr class="codeline" data-linenumber="660"><td class="num" id="LN660">660</td><td class="line"> info->pressure_unit = PRESSURE_UNIT_HPA;</td></tr> +<tr class="codeline" data-linenumber="661"><td class="num" id="LN661">661</td><td class="line"> info->distance_unit = DISTANCE_UNIT_METERS;</td></tr> +<tr class="codeline" data-linenumber="662"><td class="num" id="LN662">662</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="663"><td class="num" id="LN663">663</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="664"><td class="num" id="LN664">664</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="665"><td class="num" id="LN665">665</td><td class="line">weather_info_to_imperial (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="666"><td class="num" id="LN666">666</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="667"><td class="num" id="LN667">667</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_157<br>; if (info != ((void*)0)) _g_boolean_var_157 = 1; else _g_boolean_var_157<br> = 0; _g_boolean_var_157; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="668"><td class="num" id="LN668">668</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="669"><td class="num" id="LN669">669</td><td class="line"> info->temperature_unit = TEMP_UNIT_FAHRENHEIT;</td></tr> +<tr class="codeline" data-linenumber="670"><td class="num" id="LN670">670</td><td class="line"> info->speed_unit = SPEED_UNIT_MPH;</td></tr> +<tr class="codeline" data-linenumber="671"><td class="num" id="LN671">671</td><td class="line"> info->pressure_unit = PRESSURE_UNIT_INCH_HG;</td></tr> +<tr class="codeline" data-linenumber="672"><td class="num" id="LN672">672</td><td class="line"> info->distance_unit = DISTANCE_UNIT_MILES;</td></tr> +<tr class="codeline" data-linenumber="673"><td class="num" id="LN673">673</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="674"><td class="num" id="LN674">674</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="675"><td class="num" id="LN675">675</td><td class="line"><span class='keyword'>const</span> WeatherLocation *</td></tr> +<tr class="codeline" data-linenumber="676"><td class="num" id="LN676">676</td><td class="line">weather_info_get_location (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="677"><td class="num" id="LN677">677</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="678"><td class="num" id="LN678">678</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_158<br>; if (info != ((void*)0)) _g_boolean_var_158 = 1; else _g_boolean_var_158<br> = 0; _g_boolean_var_158; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="679"><td class="num" id="LN679">679</td><td class="line"> <span class='keyword'>return</span> info->location;</td></tr> +<tr class="codeline" data-linenumber="680"><td class="num" id="LN680">680</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="681"><td class="num" id="LN681">681</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="682"><td class="num" id="LN682">682</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="683"><td class="num" id="LN683">683</td><td class="line">weather_info_get_location_name (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="684"><td class="num" id="LN684">684</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="685"><td class="num" id="LN685">685</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_159<br>; if (info != ((void*)0)) _g_boolean_var_159 = 1; else _g_boolean_var_159<br> = 0; _g_boolean_var_159; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="686"><td class="num" id="LN686">686</td><td class="line"> <span class='macro'>g_return_val_if_fail (info->location != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_160<br>; if (info->location != ((void*)0)) _g_boolean_var_160 = 1<br>; else _g_boolean_var_160 = 0; _g_boolean_var_160; }), 1))) {<br> } else { g_return_if_fail_warning ("MateWeather", ((const char<br>*) (__func__)), "info->location != NULL"); return (((void*<br>)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="687"><td class="num" id="LN687">687</td><td class="line"> <span class='keyword'>return</span> info->location->name;</td></tr> +<tr class="codeline" data-linenumber="688"><td class="num" id="LN688">688</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="689"><td class="num" id="LN689">689</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="690"><td class="num" id="LN690">690</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="691"><td class="num" id="LN691">691</td><td class="line">weather_info_get_update (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="692"><td class="num" id="LN692">692</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="693"><td class="num" id="LN693">693</td><td class="line"> <span class='keyword'>static</span> gchar buf[200];</td></tr> +<tr class="codeline" data-linenumber="694"><td class="num" id="LN694">694</td><td class="line"> <span class='keyword'>char</span> *utf8, *timeformat;</td></tr> +<tr class="codeline" data-linenumber="695"><td class="num" id="LN695">695</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="696"><td class="num" id="LN696">696</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_161<br>; if (info != ((void*)0)) _g_boolean_var_161 = 1; else _g_boolean_var_161<br> = 0; _g_boolean_var_161; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="697"><td class="num" id="LN697">697</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="698"><td class="num" id="LN698">698</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="699"><td class="num" id="LN699">699</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="700"><td class="num" id="LN700">700</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="701"><td class="num" id="LN701">701</td><td class="line"> <span class='keyword'>if</span> (info->update != 0) {</td></tr> +<tr class="codeline" data-linenumber="702"><td class="num" id="LN702">702</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="703"><td class="num" id="LN703">703</td><td class="line"> localtime_r (&info->update, &tm);</td></tr> +<tr class="codeline" data-linenumber="704"><td class="num" id="LN704">704</td><td class="line"> <span class='comment'>/* Translators: this is a format string for strftime</span></td></tr> +<tr class="codeline" data-linenumber="705"><td class="num" id="LN705">705</td><td class="line"> <span class='comment'>* see `man 3 strftime` for more details</span></td></tr> +<tr class="codeline" data-linenumber="706"><td class="num" id="LN706">706</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="707"><td class="num" id="LN707">707</td><td class="line"> timeformat = g_locale_from_utf8 (<span class='macro'>_(<span class='string_literal'>"%a, %b %d / %H:%M"</span>)<span class='macro_popup'>(mateweather_gettext ("%a, %b %d / %H:%M"))</span></span>, -1,</td></tr> +<tr class="codeline" data-linenumber="708"><td class="num" id="LN708">708</td><td class="line"> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="709"><td class="num" id="LN709">709</td><td class="line"> <span class='keyword'>if</span> (!timeformat) {</td></tr> +<tr class="codeline" data-linenumber="710"><td class="num" id="LN710">710</td><td class="line"> strcpy (buf, <span class='string_literal'>"???"</span>);</td></tr> +<tr class="codeline" data-linenumber="711"><td class="num" id="LN711">711</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="712"><td class="num" id="LN712">712</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (strftime (buf, <span class='keyword'>sizeof</span> (buf), timeformat, &tm) <= 0) {</td></tr> +<tr class="codeline" data-linenumber="713"><td class="num" id="LN713">713</td><td class="line"> strcpy (buf, <span class='string_literal'>"???"</span>);</td></tr> +<tr class="codeline" data-linenumber="714"><td class="num" id="LN714">714</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="715"><td class="num" id="LN715">715</td><td class="line"> g_free (timeformat);</td></tr> +<tr class="codeline" data-linenumber="716"><td class="num" id="LN716">716</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="717"><td class="num" id="LN717">717</td><td class="line"> <span class='comment'>/* Convert to UTF-8 */</span></td></tr> +<tr class="codeline" data-linenumber="718"><td class="num" id="LN718">718</td><td class="line"> utf8 = g_locale_to_utf8 (buf, -1, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>, <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="719"><td class="num" id="LN719">719</td><td class="line"> <span class="mrange">strcpy</span> (buf, utf8);</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:9ex; max-width:52em">Call to function 'strcpy' is insecure as it does not provide bounding of the memory buffer. Replace unbounded copy functions with analogous functions that support length arguments such as 'strlcpy'. CWE-119</div></td></tr> +<tr class="codeline" data-linenumber="720"><td class="num" id="LN720">720</td><td class="line"> g_free (utf8);</td></tr> +<tr class="codeline" data-linenumber="721"><td class="num" id="LN721">721</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="722"><td class="num" id="LN722">722</td><td class="line"> strncpy (buf, <span class='macro'>_(<span class='string_literal'>"Unknown observation time"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown observation time"))</span></span>, <span class='keyword'>sizeof</span> (buf));</td></tr> +<tr class="codeline" data-linenumber="723"><td class="num" id="LN723">723</td><td class="line"> buf[<span class='keyword'>sizeof</span> (buf)-1] = '\0';</td></tr> +<tr class="codeline" data-linenumber="724"><td class="num" id="LN724">724</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="725"><td class="num" id="LN725">725</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="726"><td class="num" id="LN726">726</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="727"><td class="num" id="LN727">727</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="728"><td class="num" id="LN728">728</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="729"><td class="num" id="LN729">729</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="730"><td class="num" id="LN730">730</td><td class="line">weather_info_get_sky (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="731"><td class="num" id="LN731">731</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="732"><td class="num" id="LN732">732</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_162<br>; if (info != ((void*)0)) _g_boolean_var_162 = 1; else _g_boolean_var_162<br> = 0; _g_boolean_var_162; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="733"><td class="num" id="LN733">733</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="734"><td class="num" id="LN734">734</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="735"><td class="num" id="LN735">735</td><td class="line"> <span class='keyword'>if</span> (info->sky < 0)</td></tr> +<tr class="codeline" data-linenumber="736"><td class="num" id="LN736">736</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="737"><td class="num" id="LN737">737</td><td class="line"> <span class='keyword'>return</span> weather_sky_string (info->sky);</td></tr> +<tr class="codeline" data-linenumber="738"><td class="num" id="LN738">738</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="739"><td class="num" id="LN739">739</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="740"><td class="num" id="LN740">740</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="741"><td class="num" id="LN741">741</td><td class="line">weather_info_get_conditions (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="742"><td class="num" id="LN742">742</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="743"><td class="num" id="LN743">743</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_163<br>; if (info != ((void*)0)) _g_boolean_var_163 = 1; else _g_boolean_var_163<br> = 0; _g_boolean_var_163; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="744"><td class="num" id="LN744">744</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="745"><td class="num" id="LN745">745</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="746"><td class="num" id="LN746">746</td><td class="line"> <span class='keyword'>return</span> weather_conditions_string (info->cond);</td></tr> +<tr class="codeline" data-linenumber="747"><td class="num" id="LN747">747</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="748"><td class="num" id="LN748">748</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="749"><td class="num" id="LN749">749</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="750"><td class="num" id="LN750">750</td><td class="line">temperature_string (gdouble temp, TempUnit to_unit, gboolean want_round)</td></tr> +<tr class="codeline" data-linenumber="751"><td class="num" id="LN751">751</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="752"><td class="num" id="LN752">752</td><td class="line"> <span class='keyword'>static</span> gchar buf[100];</td></tr> +<tr class="codeline" data-linenumber="753"><td class="num" id="LN753">753</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="754"><td class="num" id="LN754">754</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="755"><td class="num" id="LN755">755</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_FAHRENHEIT:</td></tr> +<tr class="codeline" data-linenumber="756"><td class="num" id="LN756">756</td><td class="line"> <span class='keyword'>if</span> (!want_round) {</td></tr> +<tr class="codeline" data-linenumber="757"><td class="num" id="LN757">757</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) */</span></td></tr> +<tr class="codeline" data-linenumber="758"><td class="num" id="LN758">758</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f \302\260F"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f \302\260F"))</span></span>, temp);</td></tr> +<tr class="codeline" data-linenumber="759"><td class="num" id="LN759">759</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="760"><td class="num" id="LN760">760</td><td class="line"> <span class='keyword'>const</span> <span class='keyword'>int</span> range_problem = <span class='macro'>FE_INVALID<span class='macro_popup'>0x01</span></span> | <span class='macro'>FE_DIVBYZERO<span class='macro_popup'>0x04</span></span> | <span class='macro'>FE_OVERFLOW<span class='macro_popup'>0x08</span></span> | <span class='macro'>FE_UNDERFLOW<span class='macro_popup'>0x10</span></span>;</td></tr> +<tr class="codeline" data-linenumber="761"><td class="num" id="LN761">761</td><td class="line"> gdouble temp_r;</td></tr> +<tr class="codeline" data-linenumber="762"><td class="num" id="LN762">762</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="763"><td class="num" id="LN763">763</td><td class="line"> feclearexcept(range_problem);</td></tr> +<tr class="codeline" data-linenumber="764"><td class="num" id="LN764">764</td><td class="line"> temp_r = round (temp);</td></tr> +<tr class="codeline" data-linenumber="765"><td class="num" id="LN765">765</td><td class="line"> <span class='keyword'>if</span> (fetestexcept(range_problem))</td></tr> +<tr class="codeline" data-linenumber="766"><td class="num" id="LN766">766</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"n/a"</span>)<span class='macro_popup'>(mateweather_gettext ("n/a"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="767"><td class="num" id="LN767">767</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="768"><td class="num" id="LN768">768</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in degrees Fahrenheit (\302\260 is U+00B0 DEGREE SIGN) */</span></td></tr> +<tr class="codeline" data-linenumber="769"><td class="num" id="LN769">769</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%d \302\260F"</span>)<span class='macro_popup'>(mateweather_gettext ("%d \302\260F"))</span></span>, (<span class='keyword'>int</span>)temp_r);</td></tr> +<tr class="codeline" data-linenumber="770"><td class="num" id="LN770">770</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="771"><td class="num" id="LN771">771</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="772"><td class="num" id="LN772">772</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_CENTIGRADE:</td></tr> +<tr class="codeline" data-linenumber="773"><td class="num" id="LN773">773</td><td class="line"> <span class='keyword'>if</span> (!want_round) {</td></tr> +<tr class="codeline" data-linenumber="774"><td class="num" id="LN774">774</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) */</span></td></tr> +<tr class="codeline" data-linenumber="775"><td class="num" id="LN775">775</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f \302\260C"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f \302\260C"))</span></span>, <span class='macro'>TEMP_F_TO_C (temp)<span class='macro_popup'>(((temp) - 32.0) * (5.0/9.0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="776"><td class="num" id="LN776">776</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="777"><td class="num" id="LN777">777</td><td class="line"> <span class='keyword'>const</span> <span class='keyword'>int</span> range_problem = <span class='macro'>FE_INVALID<span class='macro_popup'>0x01</span></span> | <span class='macro'>FE_DIVBYZERO<span class='macro_popup'>0x04</span></span> | <span class='macro'>FE_OVERFLOW<span class='macro_popup'>0x08</span></span> | <span class='macro'>FE_UNDERFLOW<span class='macro_popup'>0x10</span></span>;</td></tr> +<tr class="codeline" data-linenumber="778"><td class="num" id="LN778">778</td><td class="line"> gdouble temp_r;</td></tr> +<tr class="codeline" data-linenumber="779"><td class="num" id="LN779">779</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="780"><td class="num" id="LN780">780</td><td class="line"> feclearexcept(range_problem);</td></tr> +<tr class="codeline" data-linenumber="781"><td class="num" id="LN781">781</td><td class="line"> temp_r = round (<span class='macro'>TEMP_F_TO_C (temp)<span class='macro_popup'>(((temp) - 32.0) * (5.0/9.0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="782"><td class="num" id="LN782">782</td><td class="line"> <span class='keyword'>if</span> (fetestexcept(range_problem))</td></tr> +<tr class="codeline" data-linenumber="783"><td class="num" id="LN783">783</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"n/a"</span>)<span class='macro_popup'>(mateweather_gettext ("n/a"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="784"><td class="num" id="LN784">784</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="785"><td class="num" id="LN785">785</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in degrees Celsius (\302\260 is U+00B0 DEGREE SIGN) */</span></td></tr> +<tr class="codeline" data-linenumber="786"><td class="num" id="LN786">786</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%d \302\260C"</span>)<span class='macro_popup'>(mateweather_gettext ("%d \302\260C"))</span></span>, (<span class='keyword'>int</span>)temp_r);</td></tr> +<tr class="codeline" data-linenumber="787"><td class="num" id="LN787">787</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="788"><td class="num" id="LN788">788</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="789"><td class="num" id="LN789">789</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_KELVIN:</td></tr> +<tr class="codeline" data-linenumber="790"><td class="num" id="LN790">790</td><td class="line"> <span class='keyword'>if</span> (!want_round) {</td></tr> +<tr class="codeline" data-linenumber="791"><td class="num" id="LN791">791</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in kelvin */</span></td></tr> +<tr class="codeline" data-linenumber="792"><td class="num" id="LN792">792</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f K"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f K"))</span></span>, <span class='macro'>TEMP_F_TO_K (temp)<span class='macro_popup'>((temp + 459.67) * (5.0/9.0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="793"><td class="num" id="LN793">793</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="794"><td class="num" id="LN794">794</td><td class="line"> <span class='keyword'>const</span> <span class='keyword'>int</span> range_problem = <span class='macro'>FE_INVALID<span class='macro_popup'>0x01</span></span> | <span class='macro'>FE_DIVBYZERO<span class='macro_popup'>0x04</span></span> | <span class='macro'>FE_OVERFLOW<span class='macro_popup'>0x08</span></span> | <span class='macro'>FE_UNDERFLOW<span class='macro_popup'>0x10</span></span>;</td></tr> +<tr class="codeline" data-linenumber="795"><td class="num" id="LN795">795</td><td class="line"> gdouble temp_r;</td></tr> +<tr class="codeline" data-linenumber="796"><td class="num" id="LN796">796</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="797"><td class="num" id="LN797">797</td><td class="line"> feclearexcept(range_problem);</td></tr> +<tr class="codeline" data-linenumber="798"><td class="num" id="LN798">798</td><td class="line"> temp_r = round (<span class='macro'>TEMP_F_TO_K (temp)<span class='macro_popup'>((temp + 459.67) * (5.0/9.0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="799"><td class="num" id="LN799">799</td><td class="line"> <span class='keyword'>if</span> (fetestexcept(range_problem))</td></tr> +<tr class="codeline" data-linenumber="800"><td class="num" id="LN800">800</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"n/a"</span>)<span class='macro_popup'>(mateweather_gettext ("n/a"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="801"><td class="num" id="LN801">801</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="802"><td class="num" id="LN802">802</td><td class="line"> <span class='comment'>/* Translators: This is the temperature in kelvin */</span></td></tr> +<tr class="codeline" data-linenumber="803"><td class="num" id="LN803">803</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%d K"</span>)<span class='macro_popup'>(mateweather_gettext ("%d K"))</span></span>, (<span class='keyword'>int</span>)temp_r);</td></tr> +<tr class="codeline" data-linenumber="804"><td class="num" id="LN804">804</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="805"><td class="num" id="LN805">805</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="806"><td class="num" id="LN806">806</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="807"><td class="num" id="LN807">807</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="808"><td class="num" id="LN808">808</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="809"><td class="num" id="LN809">809</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="810"><td class="num" id="LN810">810</td><td class="line"> g_warning (<span class='string_literal'>"Conversion to illegal temperature unit: %d"</span>, to_unit);</td></tr> +<tr class="codeline" data-linenumber="811"><td class="num" id="LN811">811</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="812"><td class="num" id="LN812">812</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="813"><td class="num" id="LN813">813</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="814"><td class="num" id="LN814">814</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="815"><td class="num" id="LN815">815</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="816"><td class="num" id="LN816">816</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="817"><td class="num" id="LN817">817</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="818"><td class="num" id="LN818">818</td><td class="line">weather_info_get_temp (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="819"><td class="num" id="LN819">819</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="820"><td class="num" id="LN820">820</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_164<br>; if (info != ((void*)0)) _g_boolean_var_164 = 1; else _g_boolean_var_164<br> = 0; _g_boolean_var_164; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="821"><td class="num" id="LN821">821</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="822"><td class="num" id="LN822">822</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="823"><td class="num" id="LN823">823</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="824"><td class="num" id="LN824">824</td><td class="line"> <span class='keyword'>if</span> (info->temp < -500.0)</td></tr> +<tr class="codeline" data-linenumber="825"><td class="num" id="LN825">825</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="826"><td class="num" id="LN826">826</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="827"><td class="num" id="LN827">827</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->temp, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="828"><td class="num" id="LN828">828</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="829"><td class="num" id="LN829">829</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="830"><td class="num" id="LN830">830</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="831"><td class="num" id="LN831">831</td><td class="line">weather_info_get_temp_min (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="832"><td class="num" id="LN832">832</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="833"><td class="num" id="LN833">833</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_165<br>; if (info != ((void*)0)) _g_boolean_var_165 = 1; else _g_boolean_var_165<br> = 0; _g_boolean_var_165; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="834"><td class="num" id="LN834">834</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="835"><td class="num" id="LN835">835</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->tempMinMaxValid)</td></tr> +<tr class="codeline" data-linenumber="836"><td class="num" id="LN836">836</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="837"><td class="num" id="LN837">837</td><td class="line"> <span class='keyword'>if</span> (info->temp_min < -500.0)</td></tr> +<tr class="codeline" data-linenumber="838"><td class="num" id="LN838">838</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="839"><td class="num" id="LN839">839</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="840"><td class="num" id="LN840">840</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->temp_min, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="841"><td class="num" id="LN841">841</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="842"><td class="num" id="LN842">842</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="843"><td class="num" id="LN843">843</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="844"><td class="num" id="LN844">844</td><td class="line">weather_info_get_temp_max (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="845"><td class="num" id="LN845">845</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="846"><td class="num" id="LN846">846</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_166<br>; if (info != ((void*)0)) _g_boolean_var_166 = 1; else _g_boolean_var_166<br> = 0; _g_boolean_var_166; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="847"><td class="num" id="LN847">847</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="848"><td class="num" id="LN848">848</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->tempMinMaxValid)</td></tr> +<tr class="codeline" data-linenumber="849"><td class="num" id="LN849">849</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="850"><td class="num" id="LN850">850</td><td class="line"> <span class='keyword'>if</span> (info->temp_max < -500.0)</td></tr> +<tr class="codeline" data-linenumber="851"><td class="num" id="LN851">851</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="852"><td class="num" id="LN852">852</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="853"><td class="num" id="LN853">853</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->temp_max, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="854"><td class="num" id="LN854">854</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="855"><td class="num" id="LN855">855</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="856"><td class="num" id="LN856">856</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="857"><td class="num" id="LN857">857</td><td class="line">weather_info_get_dew (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="858"><td class="num" id="LN858">858</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="859"><td class="num" id="LN859">859</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_167<br>; if (info != ((void*)0)) _g_boolean_var_167 = 1; else _g_boolean_var_167<br> = 0; _g_boolean_var_167; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="860"><td class="num" id="LN860">860</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="861"><td class="num" id="LN861">861</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="862"><td class="num" id="LN862">862</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="863"><td class="num" id="LN863">863</td><td class="line"> <span class='keyword'>if</span> (info->dew < -500.0)</td></tr> +<tr class="codeline" data-linenumber="864"><td class="num" id="LN864">864</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="865"><td class="num" id="LN865">865</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="866"><td class="num" id="LN866">866</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->dew, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="867"><td class="num" id="LN867">867</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="868"><td class="num" id="LN868">868</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="869"><td class="num" id="LN869">869</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="870"><td class="num" id="LN870">870</td><td class="line">weather_info_get_humidity (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="871"><td class="num" id="LN871">871</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="872"><td class="num" id="LN872">872</td><td class="line"> <span class='keyword'>static</span> gchar buf[20];</td></tr> +<tr class="codeline" data-linenumber="873"><td class="num" id="LN873">873</td><td class="line"> gdouble humidity;</td></tr> +<tr class="codeline" data-linenumber="874"><td class="num" id="LN874">874</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="875"><td class="num" id="LN875">875</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_168<br>; if (info != ((void*)0)) _g_boolean_var_168 = 1; else _g_boolean_var_168<br> = 0; _g_boolean_var_168; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="876"><td class="num" id="LN876">876</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="877"><td class="num" id="LN877">877</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="878"><td class="num" id="LN878">878</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="879"><td class="num" id="LN879">879</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="880"><td class="num" id="LN880">880</td><td class="line"> humidity = calc_humidity (info->temp, info->dew);</td></tr> +<tr class="codeline" data-linenumber="881"><td class="num" id="LN881">881</td><td class="line"> <span class='keyword'>if</span> (humidity < 0.0)</td></tr> +<tr class="codeline" data-linenumber="882"><td class="num" id="LN882">882</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="883"><td class="num" id="LN883">883</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="884"><td class="num" id="LN884">884</td><td class="line"> <span class='comment'>/* Translators: This is the humidity in percent */</span></td></tr> +<tr class="codeline" data-linenumber="885"><td class="num" id="LN885">885</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.f%%"</span>)<span class='macro_popup'>(mateweather_gettext ("%.f%%"))</span></span>, humidity);</td></tr> +<tr class="codeline" data-linenumber="886"><td class="num" id="LN886">886</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="887"><td class="num" id="LN887">887</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="888"><td class="num" id="LN888">888</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="889"><td class="num" id="LN889">889</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="890"><td class="num" id="LN890">890</td><td class="line">weather_info_get_apparent (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="891"><td class="num" id="LN891">891</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="892"><td class="num" id="LN892">892</td><td class="line"> gdouble apparent;</td></tr> +<tr class="codeline" data-linenumber="893"><td class="num" id="LN893">893</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="894"><td class="num" id="LN894">894</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_169<br>; if (info != ((void*)0)) _g_boolean_var_169 = 1; else _g_boolean_var_169<br> = 0; _g_boolean_var_169; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="895"><td class="num" id="LN895">895</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="896"><td class="num" id="LN896">896</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="897"><td class="num" id="LN897">897</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="898"><td class="num" id="LN898">898</td><td class="line"> apparent = calc_apparent (info);</td></tr> +<tr class="codeline" data-linenumber="899"><td class="num" id="LN899">899</td><td class="line"> <span class='keyword'>if</span> (apparent < -500.0)</td></tr> +<tr class="codeline" data-linenumber="900"><td class="num" id="LN900">900</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="901"><td class="num" id="LN901">901</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="902"><td class="num" id="LN902">902</td><td class="line"> <span class='keyword'>return</span> temperature_string (apparent, info->temperature_unit, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="903"><td class="num" id="LN903">903</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="904"><td class="num" id="LN904">904</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="905"><td class="num" id="LN905">905</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="906"><td class="num" id="LN906">906</td><td class="line">windspeed_string (gfloat knots, SpeedUnit to_unit)</td></tr> +<tr class="codeline" data-linenumber="907"><td class="num" id="LN907">907</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="908"><td class="num" id="LN908">908</td><td class="line"> <span class='keyword'>static</span> gchar buf[100];</td></tr> +<tr class="codeline" data-linenumber="909"><td class="num" id="LN909">909</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="910"><td class="num" id="LN910">910</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="911"><td class="num" id="LN911">911</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_KNOTS:</td></tr> +<tr class="codeline" data-linenumber="912"><td class="num" id="LN912">912</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed in knots */</span></td></tr> +<tr class="codeline" data-linenumber="913"><td class="num" id="LN913">913</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%0.1f knots"</span>)<span class='macro_popup'>(mateweather_gettext ("%0.1f knots"))</span></span>, knots);</td></tr> +<tr class="codeline" data-linenumber="914"><td class="num" id="LN914">914</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="915"><td class="num" id="LN915">915</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_MPH:</td></tr> +<tr class="codeline" data-linenumber="916"><td class="num" id="LN916">916</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed in miles per hour */</span></td></tr> +<tr class="codeline" data-linenumber="917"><td class="num" id="LN917">917</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f mph"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f mph"))</span></span>, <span class='macro'>WINDSPEED_KNOTS_TO_MPH (knots)<span class='macro_popup'>((knots) * 1.150779)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="918"><td class="num" id="LN918">918</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="919"><td class="num" id="LN919">919</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_KPH:</td></tr> +<tr class="codeline" data-linenumber="920"><td class="num" id="LN920">920</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed in kilometers per hour */</span></td></tr> +<tr class="codeline" data-linenumber="921"><td class="num" id="LN921">921</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f km/h"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f km/h"))</span></span>, <span class='macro'>WINDSPEED_KNOTS_TO_KPH (knots)<span class='macro_popup'>((knots) * 1.851965)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="922"><td class="num" id="LN922">922</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="923"><td class="num" id="LN923">923</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_MS:</td></tr> +<tr class="codeline" data-linenumber="924"><td class="num" id="LN924">924</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed in meters per second */</span></td></tr> +<tr class="codeline" data-linenumber="925"><td class="num" id="LN925">925</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f m/s"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f m/s"))</span></span>, <span class='macro'>WINDSPEED_KNOTS_TO_MS (knots)<span class='macro_popup'>((knots) * 0.514444)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="926"><td class="num" id="LN926">926</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="927"><td class="num" id="LN927">927</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_BFT:</td></tr> +<tr class="codeline" data-linenumber="928"><td class="num" id="LN928">928</td><td class="line"> <span class='comment'>/* Translators: This is the wind speed as a Beaufort force factor</span></td></tr> +<tr class="codeline" data-linenumber="929"><td class="num" id="LN929">929</td><td class="line"> <span class='comment'>* (commonly used in nautical wind estimation).</span></td></tr> +<tr class="codeline" data-linenumber="930"><td class="num" id="LN930">930</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="931"><td class="num" id="LN931">931</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"Beaufort force %.1f"</span>)<span class='macro_popup'>(mateweather_gettext ("Beaufort force %.1f"))</span></span>,</td></tr> +<tr class="codeline" data-linenumber="932"><td class="num" id="LN932">932</td><td class="line"> <span class='macro'>WINDSPEED_KNOTS_TO_BFT (knots)<span class='macro_popup'>(pow ((knots) * 0.615363, 0.666666))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="933"><td class="num" id="LN933">933</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="934"><td class="num" id="LN934">934</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="935"><td class="num" id="LN935">935</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="936"><td class="num" id="LN936">936</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="937"><td class="num" id="LN937">937</td><td class="line"> g_warning (<span class='string_literal'>"Conversion to illegal speed unit: %d"</span>, to_unit);</td></tr> +<tr class="codeline" data-linenumber="938"><td class="num" id="LN938">938</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="939"><td class="num" id="LN939">939</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="940"><td class="num" id="LN940">940</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="941"><td class="num" id="LN941">941</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="942"><td class="num" id="LN942">942</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="943"><td class="num" id="LN943">943</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="944"><td class="num" id="LN944">944</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="945"><td class="num" id="LN945">945</td><td class="line">weather_info_get_wind (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="946"><td class="num" id="LN946">946</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="947"><td class="num" id="LN947">947</td><td class="line"> <span class='keyword'>static</span> gchar buf[200];</td></tr> +<tr class="codeline" data-linenumber="948"><td class="num" id="LN948">948</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="949"><td class="num" id="LN949">949</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_170<br>; if (info != ((void*)0)) _g_boolean_var_170 = 1; else _g_boolean_var_170<br> = 0; _g_boolean_var_170; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="950"><td class="num" id="LN950">950</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="951"><td class="num" id="LN951">951</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="952"><td class="num" id="LN952">952</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="953"><td class="num" id="LN953">953</td><td class="line"> <span class='keyword'>if</span> (info->windspeed < 0.0 || info->wind < 0)</td></tr> +<tr class="codeline" data-linenumber="954"><td class="num" id="LN954">954</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="955"><td class="num" id="LN955">955</td><td class="line"> <span class='keyword'>if</span> (info->windspeed == 0.00) {</td></tr> +<tr class="codeline" data-linenumber="956"><td class="num" id="LN956">956</td><td class="line"> strncpy (buf, <span class='macro'>_(<span class='string_literal'>"Calm"</span>)<span class='macro_popup'>(mateweather_gettext ("Calm"))</span></span>, <span class='keyword'>sizeof</span> (buf));</td></tr> +<tr class="codeline" data-linenumber="957"><td class="num" id="LN957">957</td><td class="line"> buf[<span class='keyword'>sizeof</span> (buf)-1] = '\0';</td></tr> +<tr class="codeline" data-linenumber="958"><td class="num" id="LN958">958</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="959"><td class="num" id="LN959">959</td><td class="line"> <span class='comment'>/* Translators: This is 'wind direction' / 'wind speed' */</span></td></tr> +<tr class="codeline" data-linenumber="960"><td class="num" id="LN960">960</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%s / %s"</span>)<span class='macro_popup'>(mateweather_gettext ("%s / %s"))</span></span>,</td></tr> +<tr class="codeline" data-linenumber="961"><td class="num" id="LN961">961</td><td class="line"> weather_wind_direction_string (info->wind),</td></tr> +<tr class="codeline" data-linenumber="962"><td class="num" id="LN962">962</td><td class="line"> windspeed_string (info->windspeed, info->speed_unit));</td></tr> +<tr class="codeline" data-linenumber="963"><td class="num" id="LN963">963</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="964"><td class="num" id="LN964">964</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="965"><td class="num" id="LN965">965</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="966"><td class="num" id="LN966">966</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="967"><td class="num" id="LN967">967</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="968"><td class="num" id="LN968">968</td><td class="line">weather_info_get_pressure (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="969"><td class="num" id="LN969">969</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="970"><td class="num" id="LN970">970</td><td class="line"> <span class='keyword'>static</span> gchar buf[100];</td></tr> +<tr class="codeline" data-linenumber="971"><td class="num" id="LN971">971</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="972"><td class="num" id="LN972">972</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_171<br>; if (info != ((void*)0)) _g_boolean_var_171 = 1; else _g_boolean_var_171<br> = 0; _g_boolean_var_171; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="973"><td class="num" id="LN973">973</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="974"><td class="num" id="LN974">974</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="975"><td class="num" id="LN975">975</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="976"><td class="num" id="LN976">976</td><td class="line"> <span class='keyword'>if</span> (info->pressure < 0.0)</td></tr> +<tr class="codeline" data-linenumber="977"><td class="num" id="LN977">977</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="978"><td class="num" id="LN978">978</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="979"><td class="num" id="LN979">979</td><td class="line"> <span class='keyword'>switch</span> (info->pressure_unit) {</td></tr> +<tr class="codeline" data-linenumber="980"><td class="num" id="LN980">980</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_INCH_HG:</td></tr> +<tr class="codeline" data-linenumber="981"><td class="num" id="LN981">981</td><td class="line"> <span class='comment'>/* Translators: This is pressure in inches of mercury */</span></td></tr> +<tr class="codeline" data-linenumber="982"><td class="num" id="LN982">982</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.2f inHg"</span>)<span class='macro_popup'>(mateweather_gettext ("%.2f inHg"))</span></span>, info->pressure);</td></tr> +<tr class="codeline" data-linenumber="983"><td class="num" id="LN983">983</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="984"><td class="num" id="LN984">984</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_MM_HG:</td></tr> +<tr class="codeline" data-linenumber="985"><td class="num" id="LN985">985</td><td class="line"> <span class='comment'>/* Translators: This is pressure in millimeters of mercury */</span></td></tr> +<tr class="codeline" data-linenumber="986"><td class="num" id="LN986">986</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f mmHg"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f mmHg"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_MM (info->pressure)<span class='macro_popup'>((info->pressure) * 25.40005)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="987"><td class="num" id="LN987">987</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="988"><td class="num" id="LN988">988</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_KPA:</td></tr> +<tr class="codeline" data-linenumber="989"><td class="num" id="LN989">989</td><td class="line"> <span class='comment'>/* Translators: This is pressure in kiloPascals */</span></td></tr> +<tr class="codeline" data-linenumber="990"><td class="num" id="LN990">990</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.2f kPa"</span>)<span class='macro_popup'>(mateweather_gettext ("%.2f kPa"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_KPA (info->pressure)<span class='macro_popup'>((info->pressure) * 3.386)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="991"><td class="num" id="LN991">991</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="992"><td class="num" id="LN992">992</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_HPA:</td></tr> +<tr class="codeline" data-linenumber="993"><td class="num" id="LN993">993</td><td class="line"> <span class='comment'>/* Translators: This is pressure in hectoPascals */</span></td></tr> +<tr class="codeline" data-linenumber="994"><td class="num" id="LN994">994</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.2f hPa"</span>)<span class='macro_popup'>(mateweather_gettext ("%.2f hPa"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_HPA (info->pressure)<span class='macro_popup'>((info->pressure) * 33.86)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="995"><td class="num" id="LN995">995</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="996"><td class="num" id="LN996">996</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_MB:</td></tr> +<tr class="codeline" data-linenumber="997"><td class="num" id="LN997">997</td><td class="line"> <span class='comment'>/* Translators: This is pressure in millibars */</span></td></tr> +<tr class="codeline" data-linenumber="998"><td class="num" id="LN998">998</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.2f mb"</span>)<span class='macro_popup'>(mateweather_gettext ("%.2f mb"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_MB (info->pressure)<span class='macro_popup'>(((info->pressure) * 33.86))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="999"><td class="num" id="LN999">999</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1000"><td class="num" id="LN1000">1000</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_ATM:</td></tr> +<tr class="codeline" data-linenumber="1001"><td class="num" id="LN1001">1001</td><td class="line"> <span class='comment'>/* Translators: This is pressure in atmospheres */</span></td></tr> +<tr class="codeline" data-linenumber="1002"><td class="num" id="LN1002">1002</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.3f atm"</span>)<span class='macro_popup'>(mateweather_gettext ("%.3f atm"))</span></span>, <span class='macro'>PRESSURE_INCH_TO_ATM (info->pressure)<span class='macro_popup'>((info->pressure) * 0.033421052)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1003"><td class="num" id="LN1003">1003</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1004"><td class="num" id="LN1004">1004</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1005"><td class="num" id="LN1005">1005</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1006"><td class="num" id="LN1006">1006</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1007"><td class="num" id="LN1007">1007</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1008"><td class="num" id="LN1008">1008</td><td class="line"> g_warning (<span class='string_literal'>"Conversion to illegal pressure unit: %d"</span>, info->pressure_unit);</td></tr> +<tr class="codeline" data-linenumber="1009"><td class="num" id="LN1009">1009</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1010"><td class="num" id="LN1010">1010</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1011"><td class="num" id="LN1011">1011</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1012"><td class="num" id="LN1012">1012</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="1013"><td class="num" id="LN1013">1013</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1014"><td class="num" id="LN1014">1014</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1015"><td class="num" id="LN1015">1015</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1016"><td class="num" id="LN1016">1016</td><td class="line">weather_info_get_visibility (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1017"><td class="num" id="LN1017">1017</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1018"><td class="num" id="LN1018">1018</td><td class="line"> <span class='keyword'>static</span> gchar buf[100];</td></tr> +<tr class="codeline" data-linenumber="1019"><td class="num" id="LN1019">1019</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1020"><td class="num" id="LN1020">1020</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_172<br>; if (info != ((void*)0)) _g_boolean_var_172 = 1; else _g_boolean_var_172<br> = 0; _g_boolean_var_172; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1021"><td class="num" id="LN1021">1021</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1022"><td class="num" id="LN1022">1022</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1023"><td class="num" id="LN1023">1023</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1024"><td class="num" id="LN1024">1024</td><td class="line"> <span class='keyword'>if</span> (info->visibility < 0.0)</td></tr> +<tr class="codeline" data-linenumber="1025"><td class="num" id="LN1025">1025</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1026"><td class="num" id="LN1026">1026</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1027"><td class="num" id="LN1027">1027</td><td class="line"> <span class='keyword'>switch</span> (info->distance_unit) {</td></tr> +<tr class="codeline" data-linenumber="1028"><td class="num" id="LN1028">1028</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_MILES:</td></tr> +<tr class="codeline" data-linenumber="1029"><td class="num" id="LN1029">1029</td><td class="line"> <span class='comment'>/* Translators: This is the visibility in miles */</span></td></tr> +<tr class="codeline" data-linenumber="1030"><td class="num" id="LN1030">1030</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f miles"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f miles"))</span></span>, info->visibility);</td></tr> +<tr class="codeline" data-linenumber="1031"><td class="num" id="LN1031">1031</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1032"><td class="num" id="LN1032">1032</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_KM:</td></tr> +<tr class="codeline" data-linenumber="1033"><td class="num" id="LN1033">1033</td><td class="line"> <span class='comment'>/* Translators: This is the visibility in kilometers */</span></td></tr> +<tr class="codeline" data-linenumber="1034"><td class="num" id="LN1034">1034</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.1f km"</span>)<span class='macro_popup'>(mateweather_gettext ("%.1f km"))</span></span>, <span class='macro'>VISIBILITY_SM_TO_KM (info->visibility)<span class='macro_popup'>((info->visibility) * 1.609344)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1035"><td class="num" id="LN1035">1035</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1036"><td class="num" id="LN1036">1036</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_METERS:</td></tr> +<tr class="codeline" data-linenumber="1037"><td class="num" id="LN1037">1037</td><td class="line"> <span class='comment'>/* Translators: This is the visibility in meters */</span></td></tr> +<tr class="codeline" data-linenumber="1038"><td class="num" id="LN1038">1038</td><td class="line"> g_snprintf (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%.0fm"</span>)<span class='macro_popup'>(mateweather_gettext ("%.0fm"))</span></span>, <span class='macro'>VISIBILITY_SM_TO_M (info->visibility)<span class='macro_popup'>(((info->visibility) * 1.609344) * 1000)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1039"><td class="num" id="LN1039">1039</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1040"><td class="num" id="LN1040">1040</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1041"><td class="num" id="LN1041">1041</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1042"><td class="num" id="LN1042">1042</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1043"><td class="num" id="LN1043">1043</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1044"><td class="num" id="LN1044">1044</td><td class="line"> g_warning (<span class='string_literal'>"Conversion to illegal visibility unit: %d"</span>, info->pressure_unit);</td></tr> +<tr class="codeline" data-linenumber="1045"><td class="num" id="LN1045">1045</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>_(<span class='string_literal'>"Unknown"</span>)<span class='macro_popup'>(mateweather_gettext ("Unknown"))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1046"><td class="num" id="LN1046">1046</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1047"><td class="num" id="LN1047">1047</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1048"><td class="num" id="LN1048">1048</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="1049"><td class="num" id="LN1049">1049</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1050"><td class="num" id="LN1050">1050</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1051"><td class="num" id="LN1051">1051</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1052"><td class="num" id="LN1052">1052</td><td class="line">weather_info_get_sunrise (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1053"><td class="num" id="LN1053">1053</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1054"><td class="num" id="LN1054">1054</td><td class="line"> <span class='keyword'>static</span> gchar buf[200];</td></tr> +<tr class="codeline" data-linenumber="1055"><td class="num" id="LN1055">1055</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="1056"><td class="num" id="LN1056">1056</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1057"><td class="num" id="LN1057">1057</td><td class="line"> <span class='macro'>g_return_val_if_fail (info && info->location, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_173<br>; if (info && info->location) _g_boolean_var_173 =<br> 1; else _g_boolean_var_173 = 0; _g_boolean_var_173; }), 1)))<br> { } else { g_return_if_fail_warning ("MateWeather", ((const char<br>*) (__func__)), "info && info->location"); return (<br>((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1058"><td class="num" id="LN1058">1058</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1059"><td class="num" id="LN1059">1059</td><td class="line"> <span class='keyword'>if</span> (!info->location->latlon_valid)</td></tr> +<tr class="codeline" data-linenumber="1060"><td class="num" id="LN1060">1060</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1061"><td class="num" id="LN1061">1061</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1062"><td class="num" id="LN1062">1062</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1063"><td class="num" id="LN1063">1063</td><td class="line"> <span class='keyword'>if</span> (!calc_sun (info))</td></tr> +<tr class="codeline" data-linenumber="1064"><td class="num" id="LN1064">1064</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1065"><td class="num" id="LN1065">1065</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1066"><td class="num" id="LN1066">1066</td><td class="line"> localtime_r (&info->sunrise, &tm);</td></tr> +<tr class="codeline" data-linenumber="1067"><td class="num" id="LN1067">1067</td><td class="line"> <span class='keyword'>if</span> (strftime (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%H:%M"</span>)<span class='macro_popup'>(mateweather_gettext ("%H:%M"))</span></span>, &tm) <= 0)</td></tr> +<tr class="codeline" data-linenumber="1068"><td class="num" id="LN1068">1068</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1069"><td class="num" id="LN1069">1069</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="1070"><td class="num" id="LN1070">1070</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1071"><td class="num" id="LN1071">1071</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1072"><td class="num" id="LN1072">1072</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1073"><td class="num" id="LN1073">1073</td><td class="line">weather_info_get_sunset (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1074"><td class="num" id="LN1074">1074</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1075"><td class="num" id="LN1075">1075</td><td class="line"> <span class='keyword'>static</span> gchar buf[200];</td></tr> +<tr class="codeline" data-linenumber="1076"><td class="num" id="LN1076">1076</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="1077"><td class="num" id="LN1077">1077</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1078"><td class="num" id="LN1078">1078</td><td class="line"> <span class='macro'>g_return_val_if_fail (info && info->location, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_174<br>; if (info && info->location) _g_boolean_var_174 =<br> 1; else _g_boolean_var_174 = 0; _g_boolean_var_174; }), 1)))<br> { } else { g_return_if_fail_warning ("MateWeather", ((const char<br>*) (__func__)), "info && info->location"); return (<br>((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1079"><td class="num" id="LN1079">1079</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1080"><td class="num" id="LN1080">1080</td><td class="line"> <span class='keyword'>if</span> (!info->location->latlon_valid)</td></tr> +<tr class="codeline" data-linenumber="1081"><td class="num" id="LN1081">1081</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1082"><td class="num" id="LN1082">1082</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1083"><td class="num" id="LN1083">1083</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1084"><td class="num" id="LN1084">1084</td><td class="line"> <span class='keyword'>if</span> (!calc_sun (info))</td></tr> +<tr class="codeline" data-linenumber="1085"><td class="num" id="LN1085">1085</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1086"><td class="num" id="LN1086">1086</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1087"><td class="num" id="LN1087">1087</td><td class="line"> localtime_r (&info->sunset, &tm);</td></tr> +<tr class="codeline" data-linenumber="1088"><td class="num" id="LN1088">1088</td><td class="line"> <span class='keyword'>if</span> (strftime (buf, <span class='keyword'>sizeof</span> (buf), <span class='macro'>_(<span class='string_literal'>"%H:%M"</span>)<span class='macro_popup'>(mateweather_gettext ("%H:%M"))</span></span>, &tm) <= 0)</td></tr> +<tr class="codeline" data-linenumber="1089"><td class="num" id="LN1089">1089</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"-"</span>;</td></tr> +<tr class="codeline" data-linenumber="1090"><td class="num" id="LN1090">1090</td><td class="line"> <span class='keyword'>return</span> buf;</td></tr> +<tr class="codeline" data-linenumber="1091"><td class="num" id="LN1091">1091</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1092"><td class="num" id="LN1092">1092</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1093"><td class="num" id="LN1093">1093</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1094"><td class="num" id="LN1094">1094</td><td class="line">weather_info_get_forecast (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1095"><td class="num" id="LN1095">1095</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1096"><td class="num" id="LN1096">1096</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_175<br>; if (info != ((void*)0)) _g_boolean_var_175 = 1; else _g_boolean_var_175<br> = 0; _g_boolean_var_175; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1097"><td class="num" id="LN1097">1097</td><td class="line"> <span class='keyword'>return</span> info->forecast;</td></tr> +<tr class="codeline" data-linenumber="1098"><td class="num" id="LN1098">1098</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1099"><td class="num" id="LN1099">1099</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1100"><td class="num" id="LN1100">1100</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="1101"><td class="num" id="LN1101">1101</td><td class="line"> <span class='comment'>* weather_info_get_forecast_list:</span></td></tr> +<tr class="codeline" data-linenumber="1102"><td class="num" id="LN1102">1102</td><td class="line"> <span class='comment'>* Returns list of WeatherInfo* objects for the forecast.</span></td></tr> +<tr class="codeline" data-linenumber="1103"><td class="num" id="LN1103">1103</td><td class="line"> <span class='comment'>* The list is owned by the 'info' object thus is alive as long</span></td></tr> +<tr class="codeline" data-linenumber="1104"><td class="num" id="LN1104">1104</td><td class="line"> <span class='comment'>* as the 'info'. This list is filled only when requested with</span></td></tr> +<tr class="codeline" data-linenumber="1105"><td class="num" id="LN1105">1105</td><td class="line"> <span class='comment'>* type FORECAST_LIST and if available for given location.</span></td></tr> +<tr class="codeline" data-linenumber="1106"><td class="num" id="LN1106">1106</td><td class="line"> <span class='comment'>* The 'update' property is the date/time when the forecast info</span></td></tr> +<tr class="codeline" data-linenumber="1107"><td class="num" id="LN1107">1107</td><td class="line"> <span class='comment'>* is used for.</span></td></tr> +<tr class="codeline" data-linenumber="1108"><td class="num" id="LN1108">1108</td><td class="line"> <span class='comment'>**/</span></td></tr> +<tr class="codeline" data-linenumber="1109"><td class="num" id="LN1109">1109</td><td class="line">GSList *</td></tr> +<tr class="codeline" data-linenumber="1110"><td class="num" id="LN1110">1110</td><td class="line">weather_info_get_forecast_list (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1111"><td class="num" id="LN1111">1111</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1112"><td class="num" id="LN1112">1112</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_176<br>; if (info != ((void*)0)) _g_boolean_var_176 = 1; else _g_boolean_var_176<br> = 0; _g_boolean_var_176; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1113"><td class="num" id="LN1113">1113</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1114"><td class="num" id="LN1114">1114</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1115"><td class="num" id="LN1115">1115</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1116"><td class="num" id="LN1116">1116</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1117"><td class="num" id="LN1117">1117</td><td class="line"> <span class='keyword'>return</span> info->forecast_list;</td></tr> +<tr class="codeline" data-linenumber="1118"><td class="num" id="LN1118">1118</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1119"><td class="num" id="LN1119">1119</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1120"><td class="num" id="LN1120">1120</td><td class="line">GdkPixbufAnimation *</td></tr> +<tr class="codeline" data-linenumber="1121"><td class="num" id="LN1121">1121</td><td class="line">weather_info_get_radar (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1122"><td class="num" id="LN1122">1122</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1123"><td class="num" id="LN1123">1123</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_177<br>; if (info != ((void*)0)) _g_boolean_var_177 = 1; else _g_boolean_var_177<br> = 0; _g_boolean_var_177; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1124"><td class="num" id="LN1124">1124</td><td class="line"> <span class='keyword'>return</span> info->radar;</td></tr> +<tr class="codeline" data-linenumber="1125"><td class="num" id="LN1125">1125</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1126"><td class="num" id="LN1126">1126</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1127"><td class="num" id="LN1127">1127</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1128"><td class="num" id="LN1128">1128</td><td class="line">weather_info_get_temp_summary (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1129"><td class="num" id="LN1129">1129</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1130"><td class="num" id="LN1130">1130</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_178<br>; if (info != ((void*)0)) _g_boolean_var_178 = 1; else _g_boolean_var_178<br> = 0; _g_boolean_var_178; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1131"><td class="num" id="LN1131">1131</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1132"><td class="num" id="LN1132">1132</td><td class="line"> <span class='keyword'>if</span> (!info->valid || info->temp < -500.0)</td></tr> +<tr class="codeline" data-linenumber="1133"><td class="num" id="LN1133">1133</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"--"</span>;</td></tr> +<tr class="codeline" data-linenumber="1134"><td class="num" id="LN1134">1134</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1135"><td class="num" id="LN1135">1135</td><td class="line"> <span class='keyword'>return</span> temperature_string (info->temp, info->temperature_unit, <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1136"><td class="num" id="LN1136">1136</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1137"><td class="num" id="LN1137">1137</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1138"><td class="num" id="LN1138">1138</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1139"><td class="num" id="LN1139">1139</td><td class="line">gchar *</td></tr> +<tr class="codeline" data-linenumber="1140"><td class="num" id="LN1140">1140</td><td class="line">weather_info_get_weather_summary (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1141"><td class="num" id="LN1141">1141</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1142"><td class="num" id="LN1142">1142</td><td class="line"> <span class='keyword'>const</span> gchar *buf;</td></tr> +<tr class="codeline" data-linenumber="1143"><td class="num" id="LN1143">1143</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1144"><td class="num" id="LN1144">1144</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_179<br>; if (info != ((void*)0)) _g_boolean_var_179 = 1; else _g_boolean_var_179<br> = 0; _g_boolean_var_179; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1145"><td class="num" id="LN1145">1145</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1146"><td class="num" id="LN1146">1146</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1147"><td class="num" id="LN1147">1147</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>g_strdup (_(<span class='string_literal'>"Retrieval failed"</span>))<span class='macro_popup'>g_strdup_inline ((mateweather_gettext ("Retrieval failed")))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1148"><td class="num" id="LN1148">1148</td><td class="line"> buf = weather_info_get_conditions (info);</td></tr> +<tr class="codeline" data-linenumber="1149"><td class="num" id="LN1149">1149</td><td class="line"> <span class='keyword'>if</span> (!strcmp (buf, <span class='string_literal'>"-"</span>))</td></tr> +<tr class="codeline" data-linenumber="1150"><td class="num" id="LN1150">1150</td><td class="line"> buf = weather_info_get_sky (info);</td></tr> +<tr class="codeline" data-linenumber="1151"><td class="num" id="LN1151">1151</td><td class="line"> <span class='keyword'>return</span> g_strdup_printf (<span class='string_literal'>"%s: %s"</span>, weather_info_get_location_name (info), buf);</td></tr> +<tr class="codeline" data-linenumber="1152"><td class="num" id="LN1152">1152</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1153"><td class="num" id="LN1153">1153</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1154"><td class="num" id="LN1154">1154</td><td class="line"><span class='keyword'>const</span> gchar *</td></tr> +<tr class="codeline" data-linenumber="1155"><td class="num" id="LN1155">1155</td><td class="line">weather_info_get_icon_name (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="1156"><td class="num" id="LN1156">1156</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1157"><td class="num" id="LN1157">1157</td><td class="line"> WeatherConditions cond;</td></tr> +<tr class="codeline" data-linenumber="1158"><td class="num" id="LN1158">1158</td><td class="line"> WeatherSky sky;</td></tr> +<tr class="codeline" data-linenumber="1159"><td class="num" id="LN1159">1159</td><td class="line"> time_t current_time;</td></tr> +<tr class="codeline" data-linenumber="1160"><td class="num" id="LN1160">1160</td><td class="line"> gboolean daytime;</td></tr> +<tr class="codeline" data-linenumber="1161"><td class="num" id="LN1161">1161</td><td class="line"> gchar* icon;</td></tr> +<tr class="codeline" data-linenumber="1162"><td class="num" id="LN1162">1162</td><td class="line"> <span class='keyword'>static</span> gchar icon_buffer[32];</td></tr> +<tr class="codeline" data-linenumber="1163"><td class="num" id="LN1163">1163</td><td class="line"> WeatherMoonPhase moonPhase;</td></tr> +<tr class="codeline" data-linenumber="1164"><td class="num" id="LN1164">1164</td><td class="line"> WeatherMoonLatitude moonLat;</td></tr> +<tr class="codeline" data-linenumber="1165"><td class="num" id="LN1165">1165</td><td class="line"> gint phase;</td></tr> +<tr class="codeline" data-linenumber="1166"><td class="num" id="LN1166">1166</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1167"><td class="num" id="LN1167">1167</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_180<br>; if (info != ((void*)0)) _g_boolean_var_180 = 1; else _g_boolean_var_180<br> = 0; _g_boolean_var_180; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return (((void*)0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1168"><td class="num" id="LN1168">1168</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1169"><td class="num" id="LN1169">1169</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1170"><td class="num" id="LN1170">1170</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1171"><td class="num" id="LN1171">1171</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1172"><td class="num" id="LN1172">1172</td><td class="line"> cond = info->cond;</td></tr> +<tr class="codeline" data-linenumber="1173"><td class="num" id="LN1173">1173</td><td class="line"> sky = info->sky;</td></tr> +<tr class="codeline" data-linenumber="1174"><td class="num" id="LN1174">1174</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1175"><td class="num" id="LN1175">1175</td><td class="line"> <span class='keyword'>if</span> (cond.significant) {</td></tr> +<tr class="codeline" data-linenumber="1176"><td class="num" id="LN1176">1176</td><td class="line"> <span class='keyword'>if</span> (cond.phenomenon != PHENOMENON_NONE &&</td></tr> +<tr class="codeline" data-linenumber="1177"><td class="num" id="LN1177">1177</td><td class="line"> cond.qualifier == QUALIFIER_THUNDERSTORM)</td></tr> +<tr class="codeline" data-linenumber="1178"><td class="num" id="LN1178">1178</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-storm"</span>;</td></tr> +<tr class="codeline" data-linenumber="1179"><td class="num" id="LN1179">1179</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1180"><td class="num" id="LN1180">1180</td><td class="line"> <span class='keyword'>switch</span> (cond.phenomenon) {</td></tr> +<tr class="codeline" data-linenumber="1181"><td class="num" id="LN1181">1181</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1182"><td class="num" id="LN1182">1182</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_LAST:</td></tr> +<tr class="codeline" data-linenumber="1183"><td class="num" id="LN1183">1183</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_NONE:</td></tr> +<tr class="codeline" data-linenumber="1184"><td class="num" id="LN1184">1184</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1185"><td class="num" id="LN1185">1185</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1186"><td class="num" id="LN1186">1186</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_DRIZZLE:</td></tr> +<tr class="codeline" data-linenumber="1187"><td class="num" id="LN1187">1187</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_RAIN:</td></tr> +<tr class="codeline" data-linenumber="1188"><td class="num" id="LN1188">1188</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_UNKNOWN_PRECIPITATION:</td></tr> +<tr class="codeline" data-linenumber="1189"><td class="num" id="LN1189">1189</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_HAIL:</td></tr> +<tr class="codeline" data-linenumber="1190"><td class="num" id="LN1190">1190</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SMALL_HAIL:</td></tr> +<tr class="codeline" data-linenumber="1191"><td class="num" id="LN1191">1191</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-showers"</span>;</td></tr> +<tr class="codeline" data-linenumber="1192"><td class="num" id="LN1192">1192</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1193"><td class="num" id="LN1193">1193</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SNOW:</td></tr> +<tr class="codeline" data-linenumber="1194"><td class="num" id="LN1194">1194</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SNOW_GRAINS:</td></tr> +<tr class="codeline" data-linenumber="1195"><td class="num" id="LN1195">1195</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_ICE_PELLETS:</td></tr> +<tr class="codeline" data-linenumber="1196"><td class="num" id="LN1196">1196</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_ICE_CRYSTALS:</td></tr> +<tr class="codeline" data-linenumber="1197"><td class="num" id="LN1197">1197</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-snow"</span>;</td></tr> +<tr class="codeline" data-linenumber="1198"><td class="num" id="LN1198">1198</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1199"><td class="num" id="LN1199">1199</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_TORNADO:</td></tr> +<tr class="codeline" data-linenumber="1200"><td class="num" id="LN1200">1200</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SQUALL:</td></tr> +<tr class="codeline" data-linenumber="1201"><td class="num" id="LN1201">1201</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-storm"</span>;</td></tr> +<tr class="codeline" data-linenumber="1202"><td class="num" id="LN1202">1202</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1203"><td class="num" id="LN1203">1203</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_MIST:</td></tr> +<tr class="codeline" data-linenumber="1204"><td class="num" id="LN1204">1204</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_FOG:</td></tr> +<tr class="codeline" data-linenumber="1205"><td class="num" id="LN1205">1205</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SMOKE:</td></tr> +<tr class="codeline" data-linenumber="1206"><td class="num" id="LN1206">1206</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_VOLCANIC_ASH:</td></tr> +<tr class="codeline" data-linenumber="1207"><td class="num" id="LN1207">1207</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SAND:</td></tr> +<tr class="codeline" data-linenumber="1208"><td class="num" id="LN1208">1208</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_HAZE:</td></tr> +<tr class="codeline" data-linenumber="1209"><td class="num" id="LN1209">1209</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SPRAY:</td></tr> +<tr class="codeline" data-linenumber="1210"><td class="num" id="LN1210">1210</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_DUST:</td></tr> +<tr class="codeline" data-linenumber="1211"><td class="num" id="LN1211">1211</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_SANDSTORM:</td></tr> +<tr class="codeline" data-linenumber="1212"><td class="num" id="LN1212">1212</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_DUSTSTORM:</td></tr> +<tr class="codeline" data-linenumber="1213"><td class="num" id="LN1213">1213</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_FUNNEL_CLOUD:</td></tr> +<tr class="codeline" data-linenumber="1214"><td class="num" id="LN1214">1214</td><td class="line"> <span class='keyword'>case</span> PHENOMENON_DUST_WHIRLS:</td></tr> +<tr class="codeline" data-linenumber="1215"><td class="num" id="LN1215">1215</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-fog"</span>;</td></tr> +<tr class="codeline" data-linenumber="1216"><td class="num" id="LN1216">1216</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1217"><td class="num" id="LN1217">1217</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1218"><td class="num" id="LN1218">1218</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1219"><td class="num" id="LN1219">1219</td><td class="line"> <span class='keyword'>if</span> (info->midnightSun ||</td></tr> +<tr class="codeline" data-linenumber="1220"><td class="num" id="LN1220">1220</td><td class="line"> (!info->sunriseValid && !info->sunsetValid))</td></tr> +<tr class="codeline" data-linenumber="1221"><td class="num" id="LN1221">1221</td><td class="line"> daytime = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1222"><td class="num" id="LN1222">1222</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (info->polarNight)</td></tr> +<tr class="codeline" data-linenumber="1223"><td class="num" id="LN1223">1223</td><td class="line"> daytime = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1224"><td class="num" id="LN1224">1224</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="1225"><td class="num" id="LN1225">1225</td><td class="line"> current_time = time (<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1226"><td class="num" id="LN1226">1226</td><td class="line"> daytime =</td></tr> +<tr class="codeline" data-linenumber="1227"><td class="num" id="LN1227">1227</td><td class="line"> ( !info->sunriseValid || (current_time >= info->sunrise) ) &&</td></tr> +<tr class="codeline" data-linenumber="1228"><td class="num" id="LN1228">1228</td><td class="line"> ( !info->sunsetValid || (current_time < info->sunset) );</td></tr> +<tr class="codeline" data-linenumber="1229"><td class="num" id="LN1229">1229</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1230"><td class="num" id="LN1230">1230</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1231"><td class="num" id="LN1231">1231</td><td class="line"> <span class='keyword'>switch</span> (sky) {</td></tr> +<tr class="codeline" data-linenumber="1232"><td class="num" id="LN1232">1232</td><td class="line"> <span class='keyword'>case</span> SKY_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1233"><td class="num" id="LN1233">1233</td><td class="line"> <span class='keyword'>case</span> SKY_LAST:</td></tr> +<tr class="codeline" data-linenumber="1234"><td class="num" id="LN1234">1234</td><td class="line"> <span class='keyword'>case</span> SKY_CLEAR:</td></tr> +<tr class="codeline" data-linenumber="1235"><td class="num" id="LN1235">1235</td><td class="line"> <span class='keyword'>if</span> (daytime)</td></tr> +<tr class="codeline" data-linenumber="1236"><td class="num" id="LN1236">1236</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-clear"</span>;</td></tr> +<tr class="codeline" data-linenumber="1237"><td class="num" id="LN1237">1237</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="1238"><td class="num" id="LN1238">1238</td><td class="line"> icon = g_stpcpy(icon_buffer, <span class='string_literal'>"weather-clear-night"</span>);</td></tr> +<tr class="codeline" data-linenumber="1239"><td class="num" id="LN1239">1239</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1240"><td class="num" id="LN1240">1240</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1241"><td class="num" id="LN1241">1241</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1242"><td class="num" id="LN1242">1242</td><td class="line"> <span class='keyword'>case</span> SKY_BROKEN:</td></tr> +<tr class="codeline" data-linenumber="1243"><td class="num" id="LN1243">1243</td><td class="line"> <span class='keyword'>case</span> SKY_SCATTERED:</td></tr> +<tr class="codeline" data-linenumber="1244"><td class="num" id="LN1244">1244</td><td class="line"> <span class='keyword'>case</span> SKY_FEW:</td></tr> +<tr class="codeline" data-linenumber="1245"><td class="num" id="LN1245">1245</td><td class="line"> <span class='keyword'>if</span> (daytime)</td></tr> +<tr class="codeline" data-linenumber="1246"><td class="num" id="LN1246">1246</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-few-clouds"</span>;</td></tr> +<tr class="codeline" data-linenumber="1247"><td class="num" id="LN1247">1247</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="1248"><td class="num" id="LN1248">1248</td><td class="line"> icon = g_stpcpy(icon_buffer, <span class='string_literal'>"weather-few-clouds-night"</span>);</td></tr> +<tr class="codeline" data-linenumber="1249"><td class="num" id="LN1249">1249</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1250"><td class="num" id="LN1250">1250</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1251"><td class="num" id="LN1251">1251</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1252"><td class="num" id="LN1252">1252</td><td class="line"> <span class='keyword'>case</span> SKY_OVERCAST:</td></tr> +<tr class="codeline" data-linenumber="1253"><td class="num" id="LN1253">1253</td><td class="line"> <span class='keyword'>return</span> <span class='string_literal'>"weather-overcast"</span>;</td></tr> +<tr class="codeline" data-linenumber="1254"><td class="num" id="LN1254">1254</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1255"><td class="num" id="LN1255">1255</td><td class="line"> <span class='keyword'>default</span>: <span class='comment'>/* unrecognized */</span></td></tr> +<tr class="codeline" data-linenumber="1256"><td class="num" id="LN1256">1256</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1257"><td class="num" id="LN1257">1257</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1258"><td class="num" id="LN1258">1258</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1259"><td class="num" id="LN1259">1259</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="1260"><td class="num" id="LN1260">1260</td><td class="line"> <span class='comment'>* A phase-of-moon icon is to be returned.</span></td></tr> +<tr class="codeline" data-linenumber="1261"><td class="num" id="LN1261">1261</td><td class="line"> <span class='comment'>* Determine which one based on the moon's location</span></td></tr> +<tr class="codeline" data-linenumber="1262"><td class="num" id="LN1262">1262</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="1263"><td class="num" id="LN1263">1263</td><td class="line"> <span class='keyword'>if</span> (info->moonValid && weather_info_get_value_moonphase(info, &moonPhase, &moonLat)) {</td></tr> +<tr class="codeline" data-linenumber="1264"><td class="num" id="LN1264">1264</td><td class="line"> phase = (gint)((moonPhase * <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span> / 360.) + 0.5);</td></tr> +<tr class="codeline" data-linenumber="1265"><td class="num" id="LN1265">1265</td><td class="line"> <span class='keyword'>if</span> (phase == <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="1266"><td class="num" id="LN1266">1266</td><td class="line"> phase = 0;</td></tr> +<tr class="codeline" data-linenumber="1267"><td class="num" id="LN1267">1267</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (phase > 0 &&</td></tr> +<tr class="codeline" data-linenumber="1268"><td class="num" id="LN1268">1268</td><td class="line"> (<span class='macro'>RADIANS_TO_DEGREES(weather_info_get_location(info)->latitude)<span class='macro_popup'>((weather_info_get_location(info)->latitude) * 180. / 3.14159265358979323846<br>)</span></span></td></tr> +<tr class="codeline" data-linenumber="1269"><td class="num" id="LN1269">1269</td><td class="line"> < moonLat)) {</td></tr> +<tr class="codeline" data-linenumber="1270"><td class="num" id="LN1270">1270</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="1271"><td class="num" id="LN1271">1271</td><td class="line"> <span class='comment'>* Locations south of the moon's latitude will see the moon in the</span></td></tr> +<tr class="codeline" data-linenumber="1272"><td class="num" id="LN1272">1272</td><td class="line"> <span class='comment'>* northern sky. The moon waxes and wanes from left to right</span></td></tr> +<tr class="codeline" data-linenumber="1273"><td class="num" id="LN1273">1273</td><td class="line"> <span class='comment'>* so we reference an icon running in the opposite direction.</span></td></tr> +<tr class="codeline" data-linenumber="1274"><td class="num" id="LN1274">1274</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="1275"><td class="num" id="LN1275">1275</td><td class="line"> phase = <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span> - phase;</td></tr> +<tr class="codeline" data-linenumber="1276"><td class="num" id="LN1276">1276</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1277"><td class="num" id="LN1277">1277</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1278"><td class="num" id="LN1278">1278</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="1279"><td class="num" id="LN1279">1279</td><td class="line"> <span class='comment'>* If the moon is not full then append the angle to the icon string.</span></td></tr> +<tr class="codeline" data-linenumber="1280"><td class="num" id="LN1280">1280</td><td class="line"> <span class='comment'>* Note that an icon by this name is not required to exist:</span></td></tr> +<tr class="codeline" data-linenumber="1281"><td class="num" id="LN1281">1281</td><td class="line"> <span class='comment'>* the caller can use GTK_ICON_LOOKUP_GENERIC_FALLBACK to fall back to</span></td></tr> +<tr class="codeline" data-linenumber="1282"><td class="num" id="LN1282">1282</td><td class="line"> <span class='comment'>* the full moon image.</span></td></tr> +<tr class="codeline" data-linenumber="1283"><td class="num" id="LN1283">1283</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="1284"><td class="num" id="LN1284">1284</td><td class="line"> <span class='keyword'>if</span> ((0 == (<span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span> & 0x1)) && (<span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span>/2 != phase)) {</td></tr> +<tr class="codeline" data-linenumber="1285"><td class="num" id="LN1285">1285</td><td class="line"> g_snprintf(icon, <span class='keyword'>sizeof</span>(icon_buffer) - strlen(icon_buffer),</td></tr> +<tr class="codeline" data-linenumber="1286"><td class="num" id="LN1286">1286</td><td class="line"> <span class='string_literal'>"-%03d"</span>, phase * 360 / <span class='macro'>MOON_PHASES<span class='macro_popup'>36</span></span>);</td></tr> +<tr class="codeline" data-linenumber="1287"><td class="num" id="LN1287">1287</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1288"><td class="num" id="LN1288">1288</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1289"><td class="num" id="LN1289">1289</td><td class="line"> <span class='keyword'>return</span> icon_buffer;</td></tr> +<tr class="codeline" data-linenumber="1290"><td class="num" id="LN1290">1290</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1291"><td class="num" id="LN1291">1291</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1292"><td class="num" id="LN1292">1292</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="1293"><td class="num" id="LN1293">1293</td><td class="line">temperature_value (gdouble temp_f,</td></tr> +<tr class="codeline" data-linenumber="1294"><td class="num" id="LN1294">1294</td><td class="line"> TempUnit to_unit,</td></tr> +<tr class="codeline" data-linenumber="1295"><td class="num" id="LN1295">1295</td><td class="line"> gdouble *value,</td></tr> +<tr class="codeline" data-linenumber="1296"><td class="num" id="LN1296">1296</td><td class="line"> TempUnit def_unit)</td></tr> +<tr class="codeline" data-linenumber="1297"><td class="num" id="LN1297">1297</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1298"><td class="num" id="LN1298">1298</td><td class="line"> gboolean ok = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1299"><td class="num" id="LN1299">1299</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1300"><td class="num" id="LN1300">1300</td><td class="line"> *value = 0.0;</td></tr> +<tr class="codeline" data-linenumber="1301"><td class="num" id="LN1301">1301</td><td class="line"> <span class='keyword'>if</span> (temp_f < -500.0)</td></tr> +<tr class="codeline" data-linenumber="1302"><td class="num" id="LN1302">1302</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1303"><td class="num" id="LN1303">1303</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1304"><td class="num" id="LN1304">1304</td><td class="line"> <span class='keyword'>if</span> (to_unit == TEMP_UNIT_DEFAULT)</td></tr> +<tr class="codeline" data-linenumber="1305"><td class="num" id="LN1305">1305</td><td class="line"> to_unit = def_unit;</td></tr> +<tr class="codeline" data-linenumber="1306"><td class="num" id="LN1306">1306</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1307"><td class="num" id="LN1307">1307</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="1308"><td class="num" id="LN1308">1308</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_FAHRENHEIT:</td></tr> +<tr class="codeline" data-linenumber="1309"><td class="num" id="LN1309">1309</td><td class="line"> *value = temp_f;</td></tr> +<tr class="codeline" data-linenumber="1310"><td class="num" id="LN1310">1310</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1311"><td class="num" id="LN1311">1311</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_CENTIGRADE:</td></tr> +<tr class="codeline" data-linenumber="1312"><td class="num" id="LN1312">1312</td><td class="line"> *value = <span class='macro'>TEMP_F_TO_C (temp_f)<span class='macro_popup'>(((temp_f) - 32.0) * (5.0/9.0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1313"><td class="num" id="LN1313">1313</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1314"><td class="num" id="LN1314">1314</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_KELVIN:</td></tr> +<tr class="codeline" data-linenumber="1315"><td class="num" id="LN1315">1315</td><td class="line"> *value = <span class='macro'>TEMP_F_TO_K (temp_f)<span class='macro_popup'>((temp_f + 459.67) * (5.0/9.0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1316"><td class="num" id="LN1316">1316</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1317"><td class="num" id="LN1317">1317</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1318"><td class="num" id="LN1318">1318</td><td class="line"> <span class='keyword'>case</span> TEMP_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1319"><td class="num" id="LN1319">1319</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1320"><td class="num" id="LN1320">1320</td><td class="line"> ok = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1321"><td class="num" id="LN1321">1321</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1322"><td class="num" id="LN1322">1322</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1323"><td class="num" id="LN1323">1323</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1324"><td class="num" id="LN1324">1324</td><td class="line"> <span class='keyword'>return</span> ok;</td></tr> +<tr class="codeline" data-linenumber="1325"><td class="num" id="LN1325">1325</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1326"><td class="num" id="LN1326">1326</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1327"><td class="num" id="LN1327">1327</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="1328"><td class="num" id="LN1328">1328</td><td class="line">speed_value (gdouble knots, SpeedUnit to_unit, gdouble *value, SpeedUnit def_unit)</td></tr> +<tr class="codeline" data-linenumber="1329"><td class="num" id="LN1329">1329</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1330"><td class="num" id="LN1330">1330</td><td class="line"> gboolean ok = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1331"><td class="num" id="LN1331">1331</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1332"><td class="num" id="LN1332">1332</td><td class="line"> *value = -1.0;</td></tr> +<tr class="codeline" data-linenumber="1333"><td class="num" id="LN1333">1333</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1334"><td class="num" id="LN1334">1334</td><td class="line"> <span class='keyword'>if</span> (knots < 0.0)</td></tr> +<tr class="codeline" data-linenumber="1335"><td class="num" id="LN1335">1335</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1336"><td class="num" id="LN1336">1336</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1337"><td class="num" id="LN1337">1337</td><td class="line"> <span class='keyword'>if</span> (to_unit == SPEED_UNIT_DEFAULT)</td></tr> +<tr class="codeline" data-linenumber="1338"><td class="num" id="LN1338">1338</td><td class="line"> to_unit = def_unit;</td></tr> +<tr class="codeline" data-linenumber="1339"><td class="num" id="LN1339">1339</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1340"><td class="num" id="LN1340">1340</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="1341"><td class="num" id="LN1341">1341</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_KNOTS:</td></tr> +<tr class="codeline" data-linenumber="1342"><td class="num" id="LN1342">1342</td><td class="line"> *value = knots;</td></tr> +<tr class="codeline" data-linenumber="1343"><td class="num" id="LN1343">1343</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1344"><td class="num" id="LN1344">1344</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_MPH:</td></tr> +<tr class="codeline" data-linenumber="1345"><td class="num" id="LN1345">1345</td><td class="line"> *value = <span class='macro'>WINDSPEED_KNOTS_TO_MPH (knots)<span class='macro_popup'>((knots) * 1.150779)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1346"><td class="num" id="LN1346">1346</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1347"><td class="num" id="LN1347">1347</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_KPH:</td></tr> +<tr class="codeline" data-linenumber="1348"><td class="num" id="LN1348">1348</td><td class="line"> *value = <span class='macro'>WINDSPEED_KNOTS_TO_KPH (knots)<span class='macro_popup'>((knots) * 1.851965)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1349"><td class="num" id="LN1349">1349</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1350"><td class="num" id="LN1350">1350</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_MS:</td></tr> +<tr class="codeline" data-linenumber="1351"><td class="num" id="LN1351">1351</td><td class="line"> *value = <span class='macro'>WINDSPEED_KNOTS_TO_MS (knots)<span class='macro_popup'>((knots) * 0.514444)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1352"><td class="num" id="LN1352">1352</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1353"><td class="num" id="LN1353">1353</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_BFT:</td></tr> +<tr class="codeline" data-linenumber="1354"><td class="num" id="LN1354">1354</td><td class="line"> *value = <span class='macro'>WINDSPEED_KNOTS_TO_BFT (knots)<span class='macro_popup'>(pow ((knots) * 0.615363, 0.666666))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1355"><td class="num" id="LN1355">1355</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1356"><td class="num" id="LN1356">1356</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1357"><td class="num" id="LN1357">1357</td><td class="line"> <span class='keyword'>case</span> SPEED_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1358"><td class="num" id="LN1358">1358</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1359"><td class="num" id="LN1359">1359</td><td class="line"> ok = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1360"><td class="num" id="LN1360">1360</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1361"><td class="num" id="LN1361">1361</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1362"><td class="num" id="LN1362">1362</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1363"><td class="num" id="LN1363">1363</td><td class="line"> <span class='keyword'>return</span> ok;</td></tr> +<tr class="codeline" data-linenumber="1364"><td class="num" id="LN1364">1364</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1365"><td class="num" id="LN1365">1365</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1366"><td class="num" id="LN1366">1366</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="1367"><td class="num" id="LN1367">1367</td><td class="line">pressure_value (gdouble inHg, PressureUnit to_unit, gdouble *value, PressureUnit def_unit)</td></tr> +<tr class="codeline" data-linenumber="1368"><td class="num" id="LN1368">1368</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1369"><td class="num" id="LN1369">1369</td><td class="line"> gboolean ok = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1370"><td class="num" id="LN1370">1370</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1371"><td class="num" id="LN1371">1371</td><td class="line"> *value = -1.0;</td></tr> +<tr class="codeline" data-linenumber="1372"><td class="num" id="LN1372">1372</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1373"><td class="num" id="LN1373">1373</td><td class="line"> <span class='keyword'>if</span> (inHg < 0.0)</td></tr> +<tr class="codeline" data-linenumber="1374"><td class="num" id="LN1374">1374</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1375"><td class="num" id="LN1375">1375</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1376"><td class="num" id="LN1376">1376</td><td class="line"> <span class='keyword'>if</span> (to_unit == PRESSURE_UNIT_DEFAULT)</td></tr> +<tr class="codeline" data-linenumber="1377"><td class="num" id="LN1377">1377</td><td class="line"> to_unit = def_unit;</td></tr> +<tr class="codeline" data-linenumber="1378"><td class="num" id="LN1378">1378</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1379"><td class="num" id="LN1379">1379</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="1380"><td class="num" id="LN1380">1380</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_INCH_HG:</td></tr> +<tr class="codeline" data-linenumber="1381"><td class="num" id="LN1381">1381</td><td class="line"> *value = inHg;</td></tr> +<tr class="codeline" data-linenumber="1382"><td class="num" id="LN1382">1382</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1383"><td class="num" id="LN1383">1383</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_MM_HG:</td></tr> +<tr class="codeline" data-linenumber="1384"><td class="num" id="LN1384">1384</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_MM (inHg)<span class='macro_popup'>((inHg) * 25.40005)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1385"><td class="num" id="LN1385">1385</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1386"><td class="num" id="LN1386">1386</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_KPA:</td></tr> +<tr class="codeline" data-linenumber="1387"><td class="num" id="LN1387">1387</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_KPA (inHg)<span class='macro_popup'>((inHg) * 3.386)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1388"><td class="num" id="LN1388">1388</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1389"><td class="num" id="LN1389">1389</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_HPA:</td></tr> +<tr class="codeline" data-linenumber="1390"><td class="num" id="LN1390">1390</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_HPA (inHg)<span class='macro_popup'>((inHg) * 33.86)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1391"><td class="num" id="LN1391">1391</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1392"><td class="num" id="LN1392">1392</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_MB:</td></tr> +<tr class="codeline" data-linenumber="1393"><td class="num" id="LN1393">1393</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_MB (inHg)<span class='macro_popup'>(((inHg) * 33.86))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1394"><td class="num" id="LN1394">1394</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1395"><td class="num" id="LN1395">1395</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_ATM:</td></tr> +<tr class="codeline" data-linenumber="1396"><td class="num" id="LN1396">1396</td><td class="line"> *value = <span class='macro'>PRESSURE_INCH_TO_ATM (inHg)<span class='macro_popup'>((inHg) * 0.033421052)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1397"><td class="num" id="LN1397">1397</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1398"><td class="num" id="LN1398">1398</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1399"><td class="num" id="LN1399">1399</td><td class="line"> <span class='keyword'>case</span> PRESSURE_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1400"><td class="num" id="LN1400">1400</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1401"><td class="num" id="LN1401">1401</td><td class="line"> ok = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1402"><td class="num" id="LN1402">1402</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1403"><td class="num" id="LN1403">1403</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1404"><td class="num" id="LN1404">1404</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1405"><td class="num" id="LN1405">1405</td><td class="line"> <span class='keyword'>return</span> ok;</td></tr> +<tr class="codeline" data-linenumber="1406"><td class="num" id="LN1406">1406</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1407"><td class="num" id="LN1407">1407</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1408"><td class="num" id="LN1408">1408</td><td class="line"><span class='keyword'>static</span> gboolean</td></tr> +<tr class="codeline" data-linenumber="1409"><td class="num" id="LN1409">1409</td><td class="line">distance_value (gdouble miles, DistanceUnit to_unit, gdouble *value, DistanceUnit def_unit)</td></tr> +<tr class="codeline" data-linenumber="1410"><td class="num" id="LN1410">1410</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1411"><td class="num" id="LN1411">1411</td><td class="line"> gboolean ok = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1412"><td class="num" id="LN1412">1412</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1413"><td class="num" id="LN1413">1413</td><td class="line"> *value = -1.0;</td></tr> +<tr class="codeline" data-linenumber="1414"><td class="num" id="LN1414">1414</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1415"><td class="num" id="LN1415">1415</td><td class="line"> <span class='keyword'>if</span> (miles < 0.0)</td></tr> +<tr class="codeline" data-linenumber="1416"><td class="num" id="LN1416">1416</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1417"><td class="num" id="LN1417">1417</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1418"><td class="num" id="LN1418">1418</td><td class="line"> <span class='keyword'>if</span> (to_unit == DISTANCE_UNIT_DEFAULT)</td></tr> +<tr class="codeline" data-linenumber="1419"><td class="num" id="LN1419">1419</td><td class="line"> to_unit = def_unit;</td></tr> +<tr class="codeline" data-linenumber="1420"><td class="num" id="LN1420">1420</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1421"><td class="num" id="LN1421">1421</td><td class="line"> <span class='keyword'>switch</span> (to_unit) {</td></tr> +<tr class="codeline" data-linenumber="1422"><td class="num" id="LN1422">1422</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_MILES:</td></tr> +<tr class="codeline" data-linenumber="1423"><td class="num" id="LN1423">1423</td><td class="line"> *value = miles;</td></tr> +<tr class="codeline" data-linenumber="1424"><td class="num" id="LN1424">1424</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1425"><td class="num" id="LN1425">1425</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_KM:</td></tr> +<tr class="codeline" data-linenumber="1426"><td class="num" id="LN1426">1426</td><td class="line"> *value = <span class='macro'>VISIBILITY_SM_TO_KM (miles)<span class='macro_popup'>((miles) * 1.609344)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1427"><td class="num" id="LN1427">1427</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1428"><td class="num" id="LN1428">1428</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_METERS:</td></tr> +<tr class="codeline" data-linenumber="1429"><td class="num" id="LN1429">1429</td><td class="line"> *value = <span class='macro'>VISIBILITY_SM_TO_M (miles)<span class='macro_popup'>(((miles) * 1.609344) * 1000)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1430"><td class="num" id="LN1430">1430</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1431"><td class="num" id="LN1431">1431</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_INVALID:</td></tr> +<tr class="codeline" data-linenumber="1432"><td class="num" id="LN1432">1432</td><td class="line"> <span class='keyword'>case</span> DISTANCE_UNIT_DEFAULT:</td></tr> +<tr class="codeline" data-linenumber="1433"><td class="num" id="LN1433">1433</td><td class="line"> <span class='keyword'>default</span>:</td></tr> +<tr class="codeline" data-linenumber="1434"><td class="num" id="LN1434">1434</td><td class="line"> ok = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1435"><td class="num" id="LN1435">1435</td><td class="line"> <span class='keyword'>break</span>;</td></tr> +<tr class="codeline" data-linenumber="1436"><td class="num" id="LN1436">1436</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="1437"><td class="num" id="LN1437">1437</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1438"><td class="num" id="LN1438">1438</td><td class="line"> <span class='keyword'>return</span> ok;</td></tr> +<tr class="codeline" data-linenumber="1439"><td class="num" id="LN1439">1439</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1440"><td class="num" id="LN1440">1440</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1441"><td class="num" id="LN1441">1441</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1442"><td class="num" id="LN1442">1442</td><td class="line">weather_info_get_value_sky (WeatherInfo *info, WeatherSky *sky)</td></tr> +<tr class="codeline" data-linenumber="1443"><td class="num" id="LN1443">1443</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1444"><td class="num" id="LN1444">1444</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_181<br>; if (info != ((void*)0)) _g_boolean_var_181 = 1; else _g_boolean_var_181<br> = 0; _g_boolean_var_181; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1445"><td class="num" id="LN1445">1445</td><td class="line"> <span class='macro'>g_return_val_if_fail (sky != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_182<br>; if (sky != ((void*)0)) _g_boolean_var_182 = 1; else _g_boolean_var_182<br> = 0; _g_boolean_var_182; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "sky != NULL"); return<br> ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1446"><td class="num" id="LN1446">1446</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1447"><td class="num" id="LN1447">1447</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1448"><td class="num" id="LN1448">1448</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1449"><td class="num" id="LN1449">1449</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1450"><td class="num" id="LN1450">1450</td><td class="line"> <span class='keyword'>if</span> (info->sky <= SKY_INVALID || info->sky >= SKY_LAST)</td></tr> +<tr class="codeline" data-linenumber="1451"><td class="num" id="LN1451">1451</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1452"><td class="num" id="LN1452">1452</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1453"><td class="num" id="LN1453">1453</td><td class="line"> *sky = info->sky;</td></tr> +<tr class="codeline" data-linenumber="1454"><td class="num" id="LN1454">1454</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1455"><td class="num" id="LN1455">1455</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1456"><td class="num" id="LN1456">1456</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1457"><td class="num" id="LN1457">1457</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1458"><td class="num" id="LN1458">1458</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1459"><td class="num" id="LN1459">1459</td><td class="line">weather_info_get_value_conditions (WeatherInfo *info, WeatherConditionPhenomenon *phenomenon, WeatherConditionQualifier *qualifier)</td></tr> +<tr class="codeline" data-linenumber="1460"><td class="num" id="LN1460">1460</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1461"><td class="num" id="LN1461">1461</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_183<br>; if (info != ((void*)0)) _g_boolean_var_183 = 1; else _g_boolean_var_183<br> = 0; _g_boolean_var_183; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1462"><td class="num" id="LN1462">1462</td><td class="line"> <span class='macro'>g_return_val_if_fail (phenomenon != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_184<br>; if (phenomenon != ((void*)0)) _g_boolean_var_184 = 1; else _g_boolean_var_184<br> = 0; _g_boolean_var_184; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "phenomenon != NULL"<br>); return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1463"><td class="num" id="LN1463">1463</td><td class="line"> <span class='macro'>g_return_val_if_fail (qualifier != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_185<br>; if (qualifier != ((void*)0)) _g_boolean_var_185 = 1; else _g_boolean_var_185<br> = 0; _g_boolean_var_185; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "qualifier != NULL"<br>); return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1464"><td class="num" id="LN1464">1464</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1465"><td class="num" id="LN1465">1465</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1466"><td class="num" id="LN1466">1466</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1467"><td class="num" id="LN1467">1467</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1468"><td class="num" id="LN1468">1468</td><td class="line"> <span class='keyword'>if</span> (!info->cond.significant)</td></tr> +<tr class="codeline" data-linenumber="1469"><td class="num" id="LN1469">1469</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1470"><td class="num" id="LN1470">1470</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1471"><td class="num" id="LN1471">1471</td><td class="line"> <span class='keyword'>if</span> (!(info->cond.phenomenon > PHENOMENON_INVALID &&</td></tr> +<tr class="codeline" data-linenumber="1472"><td class="num" id="LN1472">1472</td><td class="line"> info->cond.phenomenon < PHENOMENON_LAST &&</td></tr> +<tr class="codeline" data-linenumber="1473"><td class="num" id="LN1473">1473</td><td class="line"> info->cond.qualifier > QUALIFIER_INVALID &&</td></tr> +<tr class="codeline" data-linenumber="1474"><td class="num" id="LN1474">1474</td><td class="line"> info->cond.qualifier < QUALIFIER_LAST))</td></tr> +<tr class="codeline" data-linenumber="1475"><td class="num" id="LN1475">1475</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1476"><td class="num" id="LN1476">1476</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1477"><td class="num" id="LN1477">1477</td><td class="line"> *phenomenon = info->cond.phenomenon;</td></tr> +<tr class="codeline" data-linenumber="1478"><td class="num" id="LN1478">1478</td><td class="line"> *qualifier = info->cond.qualifier;</td></tr> +<tr class="codeline" data-linenumber="1479"><td class="num" id="LN1479">1479</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1480"><td class="num" id="LN1480">1480</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1481"><td class="num" id="LN1481">1481</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1482"><td class="num" id="LN1482">1482</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1483"><td class="num" id="LN1483">1483</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1484"><td class="num" id="LN1484">1484</td><td class="line">weather_info_get_value_temp (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1485"><td class="num" id="LN1485">1485</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1486"><td class="num" id="LN1486">1486</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_186<br>; if (info != ((void*)0)) _g_boolean_var_186 = 1; else _g_boolean_var_186<br> = 0; _g_boolean_var_186; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1487"><td class="num" id="LN1487">1487</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_187<br>; if (value != ((void*)0)) _g_boolean_var_187 = 1; else _g_boolean_var_187<br> = 0; _g_boolean_var_187; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1488"><td class="num" id="LN1488">1488</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1489"><td class="num" id="LN1489">1489</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1490"><td class="num" id="LN1490">1490</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1491"><td class="num" id="LN1491">1491</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1492"><td class="num" id="LN1492">1492</td><td class="line"> <span class='keyword'>return</span> temperature_value (info->temp, unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1493"><td class="num" id="LN1493">1493</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1494"><td class="num" id="LN1494">1494</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1495"><td class="num" id="LN1495">1495</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1496"><td class="num" id="LN1496">1496</td><td class="line">weather_info_get_value_temp_min (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1497"><td class="num" id="LN1497">1497</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1498"><td class="num" id="LN1498">1498</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_188<br>; if (info != ((void*)0)) _g_boolean_var_188 = 1; else _g_boolean_var_188<br> = 0; _g_boolean_var_188; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1499"><td class="num" id="LN1499">1499</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_189<br>; if (value != ((void*)0)) _g_boolean_var_189 = 1; else _g_boolean_var_189<br> = 0; _g_boolean_var_189; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1500"><td class="num" id="LN1500">1500</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1501"><td class="num" id="LN1501">1501</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->tempMinMaxValid)</td></tr> +<tr class="codeline" data-linenumber="1502"><td class="num" id="LN1502">1502</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1503"><td class="num" id="LN1503">1503</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1504"><td class="num" id="LN1504">1504</td><td class="line"> <span class='keyword'>return</span> temperature_value (info->temp_min, unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1505"><td class="num" id="LN1505">1505</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1506"><td class="num" id="LN1506">1506</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1507"><td class="num" id="LN1507">1507</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1508"><td class="num" id="LN1508">1508</td><td class="line">weather_info_get_value_temp_max (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1509"><td class="num" id="LN1509">1509</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1510"><td class="num" id="LN1510">1510</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_190<br>; if (info != ((void*)0)) _g_boolean_var_190 = 1; else _g_boolean_var_190<br> = 0; _g_boolean_var_190; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1511"><td class="num" id="LN1511">1511</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_191<br>; if (value != ((void*)0)) _g_boolean_var_191 = 1; else _g_boolean_var_191<br> = 0; _g_boolean_var_191; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1512"><td class="num" id="LN1512">1512</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1513"><td class="num" id="LN1513">1513</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->tempMinMaxValid)</td></tr> +<tr class="codeline" data-linenumber="1514"><td class="num" id="LN1514">1514</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1515"><td class="num" id="LN1515">1515</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1516"><td class="num" id="LN1516">1516</td><td class="line"> <span class='keyword'>return</span> temperature_value (info->temp_max, unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1517"><td class="num" id="LN1517">1517</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1518"><td class="num" id="LN1518">1518</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1519"><td class="num" id="LN1519">1519</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1520"><td class="num" id="LN1520">1520</td><td class="line">weather_info_get_value_dew (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1521"><td class="num" id="LN1521">1521</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1522"><td class="num" id="LN1522">1522</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_192<br>; if (info != ((void*)0)) _g_boolean_var_192 = 1; else _g_boolean_var_192<br> = 0; _g_boolean_var_192; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1523"><td class="num" id="LN1523">1523</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_193<br>; if (value != ((void*)0)) _g_boolean_var_193 = 1; else _g_boolean_var_193<br> = 0; _g_boolean_var_193; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1524"><td class="num" id="LN1524">1524</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1525"><td class="num" id="LN1525">1525</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1526"><td class="num" id="LN1526">1526</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1527"><td class="num" id="LN1527">1527</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1528"><td class="num" id="LN1528">1528</td><td class="line"> <span class='keyword'>return</span> temperature_value (info->dew, unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1529"><td class="num" id="LN1529">1529</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1530"><td class="num" id="LN1530">1530</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1531"><td class="num" id="LN1531">1531</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1532"><td class="num" id="LN1532">1532</td><td class="line">weather_info_get_value_apparent (WeatherInfo *info, TempUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1533"><td class="num" id="LN1533">1533</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1534"><td class="num" id="LN1534">1534</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_194<br>; if (info != ((void*)0)) _g_boolean_var_194 = 1; else _g_boolean_var_194<br> = 0; _g_boolean_var_194; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1535"><td class="num" id="LN1535">1535</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_195<br>; if (value != ((void*)0)) _g_boolean_var_195 = 1; else _g_boolean_var_195<br> = 0; _g_boolean_var_195; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1536"><td class="num" id="LN1536">1536</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1537"><td class="num" id="LN1537">1537</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1538"><td class="num" id="LN1538">1538</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1539"><td class="num" id="LN1539">1539</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1540"><td class="num" id="LN1540">1540</td><td class="line"> <span class='keyword'>return</span> temperature_value (calc_apparent (info), unit, value, info->temperature_unit);</td></tr> +<tr class="codeline" data-linenumber="1541"><td class="num" id="LN1541">1541</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1542"><td class="num" id="LN1542">1542</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1543"><td class="num" id="LN1543">1543</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1544"><td class="num" id="LN1544">1544</td><td class="line">weather_info_get_value_update (WeatherInfo *info, time_t *value)</td></tr> +<tr class="codeline" data-linenumber="1545"><td class="num" id="LN1545">1545</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1546"><td class="num" id="LN1546">1546</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_196<br>; if (info != ((void*)0)) _g_boolean_var_196 = 1; else _g_boolean_var_196<br> = 0; _g_boolean_var_196; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1547"><td class="num" id="LN1547">1547</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_197<br>; if (value != ((void*)0)) _g_boolean_var_197 = 1; else _g_boolean_var_197<br> = 0; _g_boolean_var_197; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1548"><td class="num" id="LN1548">1548</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1549"><td class="num" id="LN1549">1549</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1550"><td class="num" id="LN1550">1550</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1551"><td class="num" id="LN1551">1551</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1552"><td class="num" id="LN1552">1552</td><td class="line"> *value = info->update;</td></tr> +<tr class="codeline" data-linenumber="1553"><td class="num" id="LN1553">1553</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1554"><td class="num" id="LN1554">1554</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1555"><td class="num" id="LN1555">1555</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1556"><td class="num" id="LN1556">1556</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1557"><td class="num" id="LN1557">1557</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1558"><td class="num" id="LN1558">1558</td><td class="line">weather_info_get_value_sunrise (WeatherInfo *info, time_t *value)</td></tr> +<tr class="codeline" data-linenumber="1559"><td class="num" id="LN1559">1559</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1560"><td class="num" id="LN1560">1560</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_198<br>; if (info != ((void*)0)) _g_boolean_var_198 = 1; else _g_boolean_var_198<br> = 0; _g_boolean_var_198; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1561"><td class="num" id="LN1561">1561</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_199<br>; if (value != ((void*)0)) _g_boolean_var_199 = 1; else _g_boolean_var_199<br> = 0; _g_boolean_var_199; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1562"><td class="num" id="LN1562">1562</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1563"><td class="num" id="LN1563">1563</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->sunriseValid)</td></tr> +<tr class="codeline" data-linenumber="1564"><td class="num" id="LN1564">1564</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1565"><td class="num" id="LN1565">1565</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1566"><td class="num" id="LN1566">1566</td><td class="line"> *value = info->sunrise;</td></tr> +<tr class="codeline" data-linenumber="1567"><td class="num" id="LN1567">1567</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1568"><td class="num" id="LN1568">1568</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1569"><td class="num" id="LN1569">1569</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1570"><td class="num" id="LN1570">1570</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1571"><td class="num" id="LN1571">1571</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1572"><td class="num" id="LN1572">1572</td><td class="line">weather_info_get_value_sunset (WeatherInfo *info, time_t *value)</td></tr> +<tr class="codeline" data-linenumber="1573"><td class="num" id="LN1573">1573</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1574"><td class="num" id="LN1574">1574</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_200<br>; if (info != ((void*)0)) _g_boolean_var_200 = 1; else _g_boolean_var_200<br> = 0; _g_boolean_var_200; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1575"><td class="num" id="LN1575">1575</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_201<br>; if (value != ((void*)0)) _g_boolean_var_201 = 1; else _g_boolean_var_201<br> = 0; _g_boolean_var_201; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1576"><td class="num" id="LN1576">1576</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1577"><td class="num" id="LN1577">1577</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->sunsetValid)</td></tr> +<tr class="codeline" data-linenumber="1578"><td class="num" id="LN1578">1578</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1579"><td class="num" id="LN1579">1579</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1580"><td class="num" id="LN1580">1580</td><td class="line"> *value = info->sunset;</td></tr> +<tr class="codeline" data-linenumber="1581"><td class="num" id="LN1581">1581</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1582"><td class="num" id="LN1582">1582</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1583"><td class="num" id="LN1583">1583</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1584"><td class="num" id="LN1584">1584</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1585"><td class="num" id="LN1585">1585</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1586"><td class="num" id="LN1586">1586</td><td class="line">weather_info_get_value_moonphase (WeatherInfo *info,</td></tr> +<tr class="codeline" data-linenumber="1587"><td class="num" id="LN1587">1587</td><td class="line"> WeatherMoonPhase *value,</td></tr> +<tr class="codeline" data-linenumber="1588"><td class="num" id="LN1588">1588</td><td class="line"> WeatherMoonLatitude *lat)</td></tr> +<tr class="codeline" data-linenumber="1589"><td class="num" id="LN1589">1589</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1590"><td class="num" id="LN1590">1590</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_202<br>; if (info != ((void*)0)) _g_boolean_var_202 = 1; else _g_boolean_var_202<br> = 0; _g_boolean_var_202; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1591"><td class="num" id="LN1591">1591</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_203<br>; if (value != ((void*)0)) _g_boolean_var_203 = 1; else _g_boolean_var_203<br> = 0; _g_boolean_var_203; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1592"><td class="num" id="LN1592">1592</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1593"><td class="num" id="LN1593">1593</td><td class="line"> <span class='keyword'>if</span> (!info->valid || !info->moonValid)</td></tr> +<tr class="codeline" data-linenumber="1594"><td class="num" id="LN1594">1594</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1595"><td class="num" id="LN1595">1595</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1596"><td class="num" id="LN1596">1596</td><td class="line"> *value = info->moonphase;</td></tr> +<tr class="codeline" data-linenumber="1597"><td class="num" id="LN1597">1597</td><td class="line"> *lat = info->moonlatitude;</td></tr> +<tr class="codeline" data-linenumber="1598"><td class="num" id="LN1598">1598</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1599"><td class="num" id="LN1599">1599</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1600"><td class="num" id="LN1600">1600</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1601"><td class="num" id="LN1601">1601</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1602"><td class="num" id="LN1602">1602</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1603"><td class="num" id="LN1603">1603</td><td class="line">weather_info_get_value_wind (WeatherInfo *info, SpeedUnit unit, gdouble *speed, WeatherWindDirection *direction)</td></tr> +<tr class="codeline" data-linenumber="1604"><td class="num" id="LN1604">1604</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1605"><td class="num" id="LN1605">1605</td><td class="line"> gboolean res = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1606"><td class="num" id="LN1606">1606</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1607"><td class="num" id="LN1607">1607</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_204<br>; if (info != ((void*)0)) _g_boolean_var_204 = 1; else _g_boolean_var_204<br> = 0; _g_boolean_var_204; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1608"><td class="num" id="LN1608">1608</td><td class="line"> <span class='macro'>g_return_val_if_fail (speed != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_205<br>; if (speed != ((void*)0)) _g_boolean_var_205 = 1; else _g_boolean_var_205<br> = 0; _g_boolean_var_205; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "speed != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1609"><td class="num" id="LN1609">1609</td><td class="line"> <span class='macro'>g_return_val_if_fail (direction != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_206<br>; if (direction != ((void*)0)) _g_boolean_var_206 = 1; else _g_boolean_var_206<br> = 0; _g_boolean_var_206; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "direction != NULL"<br>); return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1610"><td class="num" id="LN1610">1610</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1611"><td class="num" id="LN1611">1611</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1612"><td class="num" id="LN1612">1612</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1613"><td class="num" id="LN1613">1613</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1614"><td class="num" id="LN1614">1614</td><td class="line"> <span class='keyword'>if</span> (info->windspeed < 0.0 || info->wind <= WIND_INVALID || info->wind >= WIND_LAST)</td></tr> +<tr class="codeline" data-linenumber="1615"><td class="num" id="LN1615">1615</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1616"><td class="num" id="LN1616">1616</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1617"><td class="num" id="LN1617">1617</td><td class="line"> res = speed_value (info->windspeed, unit, speed, info->speed_unit);</td></tr> +<tr class="codeline" data-linenumber="1618"><td class="num" id="LN1618">1618</td><td class="line"> *direction = info->wind;</td></tr> +<tr class="codeline" data-linenumber="1619"><td class="num" id="LN1619">1619</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1620"><td class="num" id="LN1620">1620</td><td class="line"> <span class='keyword'>return</span> res;</td></tr> +<tr class="codeline" data-linenumber="1621"><td class="num" id="LN1621">1621</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1622"><td class="num" id="LN1622">1622</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1623"><td class="num" id="LN1623">1623</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1624"><td class="num" id="LN1624">1624</td><td class="line">weather_info_get_value_pressure (WeatherInfo *info, PressureUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1625"><td class="num" id="LN1625">1625</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1626"><td class="num" id="LN1626">1626</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_207<br>; if (info != ((void*)0)) _g_boolean_var_207 = 1; else _g_boolean_var_207<br> = 0; _g_boolean_var_207; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1627"><td class="num" id="LN1627">1627</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_208<br>; if (value != ((void*)0)) _g_boolean_var_208 = 1; else _g_boolean_var_208<br> = 0; _g_boolean_var_208; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1628"><td class="num" id="LN1628">1628</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1629"><td class="num" id="LN1629">1629</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1630"><td class="num" id="LN1630">1630</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1631"><td class="num" id="LN1631">1631</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1632"><td class="num" id="LN1632">1632</td><td class="line"> <span class='keyword'>return</span> pressure_value (info->pressure, unit, value, info->pressure_unit);</td></tr> +<tr class="codeline" data-linenumber="1633"><td class="num" id="LN1633">1633</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1634"><td class="num" id="LN1634">1634</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1635"><td class="num" id="LN1635">1635</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1636"><td class="num" id="LN1636">1636</td><td class="line">weather_info_get_value_visibility (WeatherInfo *info, DistanceUnit unit, gdouble *value)</td></tr> +<tr class="codeline" data-linenumber="1637"><td class="num" id="LN1637">1637</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1638"><td class="num" id="LN1638">1638</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_209<br>; if (info != ((void*)0)) _g_boolean_var_209 = 1; else _g_boolean_var_209<br> = 0; _g_boolean_var_209; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1639"><td class="num" id="LN1639">1639</td><td class="line"> <span class='macro'>g_return_val_if_fail (value != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_210<br>; if (value != ((void*)0)) _g_boolean_var_210 = 1; else _g_boolean_var_210<br> = 0; _g_boolean_var_210; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "value != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1640"><td class="num" id="LN1640">1640</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1641"><td class="num" id="LN1641">1641</td><td class="line"> <span class='keyword'>if</span> (!info->valid)</td></tr> +<tr class="codeline" data-linenumber="1642"><td class="num" id="LN1642">1642</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1643"><td class="num" id="LN1643">1643</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1644"><td class="num" id="LN1644">1644</td><td class="line"> <span class='keyword'>return</span> distance_value (info->visibility, unit, value, info->distance_unit);</td></tr> +<tr class="codeline" data-linenumber="1645"><td class="num" id="LN1645">1645</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1646"><td class="num" id="LN1646">1646</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1647"><td class="num" id="LN1647">1647</td><td class="line"><span class='comment'>/**</span></td></tr> +<tr class="codeline" data-linenumber="1648"><td class="num" id="LN1648">1648</td><td class="line"> <span class='comment'>* weather_info_get_upcoming_moonphases:</span></td></tr> +<tr class="codeline" data-linenumber="1649"><td class="num" id="LN1649">1649</td><td class="line"> <span class='comment'>* @info: WeatherInfo containing the time_t of interest</span></td></tr> +<tr class="codeline" data-linenumber="1650"><td class="num" id="LN1650">1650</td><td class="line"> <span class='comment'>* @phases: An array of four time_t values that will hold the returned values.</span></td></tr> +<tr class="codeline" data-linenumber="1651"><td class="num" id="LN1651">1651</td><td class="line"> <span class='comment'>* The values are estimates of the time of the next new, quarter, full and</span></td></tr> +<tr class="codeline" data-linenumber="1652"><td class="num" id="LN1652">1652</td><td class="line"> <span class='comment'>* three-quarter moons.</span></td></tr> +<tr class="codeline" data-linenumber="1653"><td class="num" id="LN1653">1653</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="1654"><td class="num" id="LN1654">1654</td><td class="line"> <span class='comment'>* Returns: gboolean indicating success or failure</span></td></tr> +<tr class="codeline" data-linenumber="1655"><td class="num" id="LN1655">1655</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="1656"><td class="num" id="LN1656">1656</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="1657"><td class="num" id="LN1657">1657</td><td class="line">weather_info_get_upcoming_moonphases (WeatherInfo *info, time_t *phases)</td></tr> +<tr class="codeline" data-linenumber="1658"><td class="num" id="LN1658">1658</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1659"><td class="num" id="LN1659">1659</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_211<br>; if (info != ((void*)0)) _g_boolean_var_211 = 1; else _g_boolean_var_211<br> = 0; _g_boolean_var_211; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1660"><td class="num" id="LN1660">1660</td><td class="line"> <span class='macro'>g_return_val_if_fail (phases != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_212<br>; if (phases != ((void*)0)) _g_boolean_var_212 = 1; else _g_boolean_var_212<br> = 0; _g_boolean_var_212; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "phases != NULL"<br>); return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1661"><td class="num" id="LN1661">1661</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1662"><td class="num" id="LN1662">1662</td><td class="line"> <span class='keyword'>return</span> calc_moon_phases(info, phases);</td></tr> +<tr class="codeline" data-linenumber="1663"><td class="num" id="LN1663">1663</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="1664"><td class="num" id="LN1664">1664</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="1665"><td class="num" id="LN1665">1665</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="1666"><td class="num" id="LN1666">1666</td><td class="line">_weather_internal_check (<span class='keyword'>void</span>)</td></tr> +<tr class="codeline" data-linenumber="1667"><td class="num" id="LN1667">1667</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="1668"><td class="num" id="LN1668">1668</td><td class="line"> <span class='macro'>g_assert (G_N_ELEMENTS (wind_direction_str) == WIND_LAST)<span class='macro_popup'>do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_213<br>; if ((sizeof (wind_direction_str) / sizeof ((wind_direction_str<br>)[0])) == WIND_LAST) _g_boolean_var_213 = 1; else _g_boolean_var_213<br> = 0; _g_boolean_var_213; }), 1)) ; else g_assertion_message_expr<br> ("MateWeather", "weather.c", 1668, ((const char*) (__func__)<br>), "G_N_ELEMENTS (wind_direction_str) == WIND_LAST"); } while<br> (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1669"><td class="num" id="LN1669">1669</td><td class="line"> <span class='macro'>g_assert (G_N_ELEMENTS (sky_str) == SKY_LAST)<span class='macro_popup'>do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_214<br>; if ((sizeof (sky_str) / sizeof ((sky_str)[0])) == SKY_LAST)<br> _g_boolean_var_214 = 1; else _g_boolean_var_214 = 0; _g_boolean_var_214<br>; }), 1)) ; else g_assertion_message_expr ("MateWeather", "weather.c"<br>, 1669, ((const char*) (__func__)), "G_N_ELEMENTS (sky_str) == SKY_LAST"<br>); } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1670"><td class="num" id="LN1670">1670</td><td class="line"> <span class='macro'>g_assert (G_N_ELEMENTS (conditions_str) == PHENOMENON_LAST)<span class='macro_popup'>do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_215<br>; if ((sizeof (conditions_str) / sizeof ((conditions_str)[0])<br>) == PHENOMENON_LAST) _g_boolean_var_215 = 1; else _g_boolean_var_215<br> = 0; _g_boolean_var_215; }), 1)) ; else g_assertion_message_expr<br> ("MateWeather", "weather.c", 1670, ((const char*) (__func__)<br>), "G_N_ELEMENTS (conditions_str) == PHENOMENON_LAST"); } while<br> (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1671"><td class="num" id="LN1671">1671</td><td class="line"> <span class='macro'>g_assert (G_N_ELEMENTS (conditions_str[0]) == QUALIFIER_LAST)<span class='macro_popup'>do { if (__builtin_expect (__extension__ ({ int _g_boolean_var_216<br>; if ((sizeof (conditions_str[0]) / sizeof ((conditions_str[0<br>])[0])) == QUALIFIER_LAST) _g_boolean_var_216 = 1; else _g_boolean_var_216<br> = 0; _g_boolean_var_216; }), 1)) ; else g_assertion_message_expr<br> ("MateWeather", "weather.c", 1671, ((const char*) (__func__)<br>), "G_N_ELEMENTS (conditions_str[0]) == QUALIFIER_LAST"); } while<br> (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="1672"><td class="num" id="LN1672">1672</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-d766a0.html b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-d766a0.html new file mode 100644 index 0000000..dab7ee8 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/report-d766a0.html @@ -0,0 +1,1245 @@ +<!doctype html> +<html> +<head> +<title>weather-metar.c</title> + +<style type="text/css"> +body { color:#000000; background-color:#ffffff } +body { font-family:Helvetica, sans-serif; font-size:10pt } +h1 { font-size:14pt } +.FileName { margin-top: 5px; margin-bottom: 5px; display: inline; } +.FileNav { margin-left: 5px; margin-right: 5px; display: inline; } +.FileNav a { text-decoration:none; font-size: larger; } +.divider { margin-top: 30px; margin-bottom: 30px; height: 15px; } +.divider { background-color: gray; } +.code { border-collapse:collapse; width:100%; } +.code { font-family: "Monospace", monospace; font-size:10pt } +.code { line-height: 1.2em } +.comment { color: green; font-style: oblique } +.keyword { color: blue } +.string_literal { color: red } +.directive { color: darkmagenta } + +/* Macros and variables could have pop-up notes hidden by default. + - Macro pop-up: expansion of the macro + - Variable pop-up: value (table) of the variable */ +.macro_popup, .variable_popup { display: none; } + +/* Pop-up appears on mouse-hover event. */ +.macro:hover .macro_popup, .variable:hover .variable_popup { + display: block; + padding: 2px; + -webkit-border-radius:5px; + -webkit-box-shadow:1px 1px 7px #000; + border-radius:5px; + box-shadow:1px 1px 7px #000; + position: absolute; + top: -1em; + left:10em; + z-index: 1 +} + +.macro_popup { + border: 2px solid red; + background-color:#FFF0F0; + font-weight: normal; +} + +.variable_popup { + border: 2px solid blue; + background-color:#F0F0FF; + font-weight: bold; + font-family: Helvetica, sans-serif; + font-size: 9pt; +} + +/* Pop-up notes needs a relative position as a base where they pops up. */ +.macro, .variable { + background-color: PaleGoldenRod; + position: relative; +} +.macro { color: DarkMagenta; } + +#tooltiphint { + position: fixed; + width: 50em; + margin-left: -25em; + left: 50%; + padding: 10px; + border: 1px solid #b0b0b0; + border-radius: 2px; + box-shadow: 1px 1px 7px black; + background-color: #c0c0c0; + z-index: 2; +} + +.num { width:2.5em; padding-right:2ex; background-color:#eeeeee } +.num { text-align:right; font-size:8pt } +.num { color:#444444 } +.line { padding-left: 1ex; border-left: 3px solid #ccc } +.line { white-space: pre } +.msg { -webkit-box-shadow:1px 1px 7px #000 } +.msg { box-shadow:1px 1px 7px #000 } +.msg { -webkit-border-radius:5px } +.msg { border-radius:5px } +.msg { font-family:Helvetica, sans-serif; font-size:8pt } +.msg { float:left } +.msg { position:relative } +.msg { padding:0.25em 1ex 0.25em 1ex } +.msg { margin-top:10px; margin-bottom:10px } +.msg { font-weight:bold } +.msg { max-width:60em; word-wrap: break-word; white-space: pre-wrap } +.msgT { padding:0x; spacing:0x } +.msgEvent { background-color:#fff8b4; color:#000000 } +.msgControl { background-color:#bbbbbb; color:#000000 } +.msgNote { background-color:#ddeeff; color:#000000 } +.mrange { background-color:#dfddf3 } +.mrange { border-bottom:1px solid #6F9DBE } +.PathIndex { font-weight: bold; padding:0px 5px; margin-right:5px; } +.PathIndex { -webkit-border-radius:8px } +.PathIndex { border-radius:8px } +.PathIndexEvent { background-color:#bfba87 } +.PathIndexControl { background-color:#8c8c8c } +.PathIndexPopUp { background-color: #879abc; } +.PathNav a { text-decoration:none; font-size: larger } +.CodeInsertionHint { font-weight: bold; background-color: #10dd10 } +.CodeRemovalHint { background-color:#de1010 } +.CodeRemovalHint { border-bottom:1px solid #6F9DBE } +.msg.selected{ background-color:orange !important; } + +table.simpletable { + padding: 5px; + font-size:12pt; + margin:20px; + border-collapse: collapse; border-spacing: 0px; +} +td.rowname { + text-align: right; + vertical-align: top; + font-weight: bold; + color:#444444; + padding-right:2ex; +} + +/* Hidden text. */ +input.spoilerhider + label { + cursor: pointer; + text-decoration: underline; + display: block; +} +input.spoilerhider { + display: none; +} +input.spoilerhider ~ .spoiler { + overflow: hidden; + margin: 10px auto 0; + height: 0; + opacity: 0; +} +input.spoilerhider:checked + label + .spoiler{ + height: auto; + opacity: 1; +} +</style> +</head> +<body> +<!-- BUGDESC Value stored to 'i' is never read --> + +<!-- BUGTYPE Dead assignment --> + +<!-- BUGCATEGORY Unused code --> + +<!-- BUGFILE /rootdir/libmateweather/weather-metar.c --> + +<!-- FILENAME weather-metar.c --> + +<!-- FUNCTIONNAME metar_parse --> + +<!-- ISSUEHASHCONTENTOFLINEINCONTEXT d766a0e5bf18a00e3f5446f823316a7b --> + +<!-- BUGLINE 454 --> + +<!-- BUGCOLUMN 5 --> + +<!-- BUGPATHLENGTH 1 --> + +<!-- BUGMETAEND --> +<!-- REPORTHEADER --> +<h3>Bug Summary</h3> +<table class="simpletable"> +<tr><td class="rowname">File:</td><td>weather-metar.c</td></tr> +<tr><td class="rowname">Warning:</td><td><a href="#EndPath">line 454, column 5</a><br />Value stored to 'i' is never read</td></tr> + +</table> +<!-- REPORTSUMMARYEXTRA --> +<h3>Annotated Source Code</h3> +<p>Press <a href="#" onclick="toggleHelp(); return false;">'?'</a> + to see keyboard shortcuts</p> +<input type="checkbox" class="spoilerhider" id="showinvocation" /> +<label for="showinvocation" >Show analyzer invocation</label> +<div class="spoiler">clang -cc1 -cc1 -triple x86_64-redhat-linux-gnu -analyze -disable-free -clear-ast-before-backend -disable-llvm-verifier -discard-value-names -main-file-name weather-metar.c -analyzer-checker=core -analyzer-checker=apiModeling -analyzer-checker=unix -analyzer-checker=deadcode -analyzer-checker=security.insecureAPI.UncheckedReturn -analyzer-checker=security.insecureAPI.getpw -analyzer-checker=security.insecureAPI.gets -analyzer-checker=security.insecureAPI.mktemp -analyzer-checker=security.insecureAPI.mkstemp -analyzer-checker=security.insecureAPI.vfork -analyzer-checker=nullability.NullPassedToNonnull -analyzer-checker=nullability.NullReturnedFromNonnull -analyzer-output plist -w -setup-static-analyzer -mrelocation-model pic -pic-level 2 -fhalf-no-semantic-interposition -mframe-pointer=none -fmath-errno -ffp-contract=on -fno-rounding-math -mconstructor-aliases -funwind-tables=2 -target-cpu x86-64 -tune-cpu generic -debugger-tuning=gdb -fcoverage-compilation-dir=/rootdir/libmateweather -resource-dir /usr/bin/../lib/clang/17 -D HAVE_CONFIG_H -I . -I .. -I /usr/include/gtk-3.0 -I /usr/include/pango-1.0 -I /usr/include/gdk-pixbuf-2.0 -I /usr/include/cairo -I /usr/include/dbus-1.0 -I /usr/lib64/dbus-1.0/include -I /usr/include/atk-1.0 -I /usr/include/harfbuzz -I /usr/include/freetype2 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/at-spi2-atk/2.0 -I /usr/include/cloudproviders -I /usr/include/blkid -I /usr/include/at-spi-2.0 -I /usr/include/gio-unix-2.0 -I /usr/include/libmount -I /usr/include/pixman-1 -I /usr/include/libxml2 -I /usr/include/fribidi -I /usr/include/sysprof-6 -I /usr/include/libpng16 -I .. -I . -I /usr/include/libxml2 -I /usr/include/libsoup-2.4 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libxml2 -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -I /usr/include/glib-2.0 -I /usr/lib64/glib-2.0/include -I /usr/include/libmount -I /usr/include/blkid -I /usr/include/sysprof-6 -D G_LOG_DOMAIN="MateWeather" -D MATELOCALEDIR="/usr/local/share/locale" -D MATEWEATHER_XML_LOCATION_DIR="/usr/local/share/libmateweather" -D PIC -internal-isystem /usr/bin/../lib/clang/17/include -internal-isystem /usr/local/include -internal-isystem /usr/bin/../lib/gcc/x86_64-redhat-linux/13/../../../../x86_64-redhat-linux/include -internal-externc-isystem /include -internal-externc-isystem /usr/include -O2 -Wno-unused-parameter -fdebug-compilation-dir=/rootdir/libmateweather -ferror-limit 19 -fgnuc-version=4.2.1 -vectorize-loops -vectorize-slp -analyzer-checker deadcode.DeadStores -analyzer-checker alpha.deadcode.UnreachableCode -analyzer-checker alpha.core.CastSize -analyzer-checker alpha.core.CastToStruct -analyzer-checker alpha.core.IdenticalExpr -analyzer-checker alpha.core.SizeofPtr -analyzer-checker alpha.security.ArrayBoundV2 -analyzer-checker alpha.security.MallocOverflow -analyzer-checker alpha.security.ReturnPtrRange -analyzer-checker alpha.unix.SimpleStream -analyzer-checker alpha.unix.cstring.BufferOverlap -analyzer-checker alpha.unix.cstring.NotNullTerminated -analyzer-checker alpha.unix.cstring.OutOfBounds -analyzer-checker alpha.core.FixedAddr -analyzer-checker security.insecureAPI.strcpy -analyzer-output=html -faddrsig -D__GCC_HAVE_DWARF2_CFI_ASM=1 -o /rootdir/html-report/2024-02-14-202956-5881-1 -x c weather-metar.c +</div> +<div id='tooltiphint' hidden="true"> + <p>Keyboard shortcuts: </p> + <ul> + <li>Use 'j/k' keys for keyboard navigation</li> + <li>Use 'Shift+S' to show/hide relevant lines</li> + <li>Use '?' to toggle this window</li> + </ul> + <a href="#" onclick="toggleHelp(); return false;">Close</a> +</div> +<script type='text/javascript'> +var relevant_lines = {"1": {"454": 1}}; + +var filterCounterexample = function (hide) { + var tables = document.getElementsByClassName("code"); + for (var t=0; t<tables.length; t++) { + var table = tables[t]; + var file_id = table.getAttribute("data-fileid"); + var lines_in_fid = relevant_lines[file_id]; + if (!lines_in_fid) { + lines_in_fid = {}; + } + var lines = table.getElementsByClassName("codeline"); + for (var i=0; i<lines.length; i++) { + var el = lines[i]; + var lineNo = el.getAttribute("data-linenumber"); + if (!lines_in_fid[lineNo]) { + if (hide) { + el.setAttribute("hidden", ""); + } else { + el.removeAttribute("hidden"); + } + } + } + } +} + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // SHIFT + S + if (event.shiftKey && event.keyCode == 83) { + var checked = document.getElementsByName("showCounterexample")[0].checked; + filterCounterexample(!checked); + document.getElementsByName("showCounterexample")[0].click(); + } else { + return; + } + event.preventDefault(); +}, true); + +document.addEventListener("DOMContentLoaded", function() { + document.querySelector('input[name="showCounterexample"]').onchange= + function (event) { + filterCounterexample(this.checked); + }; +}); +</script> + +<form> + <input type="checkbox" name="showCounterexample" id="showCounterexample" /> + <label for="showCounterexample"> + Show only relevant lines + </label> + <input type="checkbox" name="showArrows" + id="showArrows" style="margin-left: 10px" /> + <label for="showArrows"> + Show control flow arrows + </label> +</form> + +<script type='text/javascript'> +// Return range of numbers from a range [lower, upper). +function range(lower, upper) { + var array = []; + for (var i = lower; i <= upper; ++i) { + array.push(i); + } + return array; +} + +var getRelatedArrowIndices = function(pathId) { + // HTML numeration of events is a bit different than it is in the path. + // Everything is rotated one step to the right, so the last element + // (error diagnostic) has index 0. + if (pathId == 0) { + // arrowIndices has at least 2 elements + pathId = arrowIndices.length - 1; + } + + return range(arrowIndices[pathId], arrowIndices[pathId - 1]); +} + +var highlightArrowsForSelectedEvent = function() { + const selectedNum = findNum(); + const arrowIndicesToHighlight = getRelatedArrowIndices(selectedNum); + arrowIndicesToHighlight.forEach((index) => { + var arrow = document.querySelector("#arrow" + index); + if(arrow) { + classListAdd(arrow, "selected") + } + }); +} + +var getAbsoluteBoundingRect = function(element) { + const relative = element.getBoundingClientRect(); + return { + left: relative.left + window.pageXOffset, + right: relative.right + window.pageXOffset, + top: relative.top + window.pageYOffset, + bottom: relative.bottom + window.pageYOffset, + height: relative.height, + width: relative.width + }; +} + +var drawArrow = function(index) { + // This function is based on the great answer from SO: + // https://stackoverflow.com/a/39575674/11582326 + var start = document.querySelector("#start" + index); + var end = document.querySelector("#end" + index); + var arrow = document.querySelector("#arrow" + index); + + var startRect = getAbsoluteBoundingRect(start); + var endRect = getAbsoluteBoundingRect(end); + + // It is an arrow from a token to itself, no need to visualize it. + if (startRect.top == endRect.top && + startRect.left == endRect.left) + return; + + // Each arrow is a very simple Bézier curve, with two nodes and + // two handles. So, we need to calculate four points in the window: + // * start node + var posStart = { x: 0, y: 0 }; + // * end node + var posEnd = { x: 0, y: 0 }; + // * handle for the start node + var startHandle = { x: 0, y: 0 }; + // * handle for the end node + var endHandle = { x: 0, y: 0 }; + // One can visualize it as follows: + // + // start handle + // / + // X"""_.-""""X + // .' \ + // / start node + // | + // | + // | end node + // \ / + // `->X + // X-' + // \ + // end handle + // + // NOTE: (0, 0) is the top left corner of the window. + + // We have 3 similar, but still different scenarios to cover: + // + // 1. Two tokens on different lines. + // -xxx + // / + // \ + // -> xxx + // In this situation, we draw arrow on the left curving to the left. + // 2. Two tokens on the same line, and the destination is on the right. + // ____ + // / \ + // / V + // xxx xxx + // In this situation, we draw arrow above curving upwards. + // 3. Two tokens on the same line, and the destination is on the left. + // xxx xxx + // ^ / + // \____/ + // In this situation, we draw arrow below curving downwards. + const onDifferentLines = startRect.top <= endRect.top - 5 || + startRect.top >= endRect.top + 5; + const leftToRight = startRect.left < endRect.left; + + // NOTE: various magic constants are chosen empirically for + // better positioning and look + if (onDifferentLines) { + // Case #1 + const topToBottom = startRect.top < endRect.top; + posStart.x = startRect.left - 1; + // We don't want to start it at the top left corner of the token, + // it doesn't feel like this is where the arrow comes from. + // For this reason, we start it in the middle of the left side + // of the token. + posStart.y = startRect.top + startRect.height / 2; + + // End node has arrow head and we give it a bit more space. + posEnd.x = endRect.left - 4; + posEnd.y = endRect.top; + + // Utility object with x and y offsets for handles. + var curvature = { + // We want bottom-to-top arrow to curve a bit more, so it doesn't + // overlap much with top-to-bottom curves (much more frequent). + x: topToBottom ? 15 : 25, + y: Math.min((posEnd.y - posStart.y) / 3, 10) + } + + // When destination is on the different line, we can make a + // curvier arrow because we have space for it. + // So, instead of using + // + // startHandle.x = posStart.x - curvature.x + // endHandle.x = posEnd.x - curvature.x + // + // We use the leftmost of these two values for both handles. + startHandle.x = Math.min(posStart.x, posEnd.x) - curvature.x; + endHandle.x = startHandle.x; + + // Curving downwards from the start node... + startHandle.y = posStart.y + curvature.y; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else if (leftToRight) { + // Case #2 + // Starting from the top right corner... + posStart.x = startRect.right - 1; + posStart.y = startRect.top; + + // ...and ending at the top left corner of the end token. + posEnd.x = endRect.left + 1; + posEnd.y = endRect.top - 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posEnd.x - posStart.x) / 3, 15), + y: 5 + } + + // Curving to the right... + startHandle.x = posStart.x + curvature.x; + // ... and upwards from the start node. + startHandle.y = posStart.y - curvature.y; + + // And to the left... + endHandle.x = posEnd.x - curvature.x; + // ... and upwards from the end node. + endHandle.y = posEnd.y - curvature.y; + + } else { + // Case #3 + // Starting from the bottom right corner... + posStart.x = startRect.right; + posStart.y = startRect.bottom; + + // ...and ending also at the bottom right corner, but of the end token. + posEnd.x = endRect.right - 1; + posEnd.y = endRect.bottom + 1; + + // Utility object with x and y offsets for handles. + var curvature = { + x: Math.min((posStart.x - posEnd.x) / 3, 15), + y: 5 + } + + // Curving to the left... + startHandle.x = posStart.x - curvature.x; + // ... and downwards from the start node. + startHandle.y = posStart.y + curvature.y; + + // And to the right... + endHandle.x = posEnd.x + curvature.x; + // ... and downwards from the end node. + endHandle.y = posEnd.y + curvature.y; + } + + // Put it all together into a path. + // More information on the format: + // https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Paths + var pathStr = "M" + posStart.x + "," + posStart.y + " " + + "C" + startHandle.x + "," + startHandle.y + " " + + endHandle.x + "," + endHandle.y + " " + + posEnd.x + "," + posEnd.y; + + arrow.setAttribute("d", pathStr); +}; + +var drawArrows = function() { + const numOfArrows = document.querySelectorAll("path[id^=arrow]").length; + for (var i = 0; i < numOfArrows; ++i) { + drawArrow(i); + } +} + +var toggleArrows = function(event) { + const arrows = document.querySelector("#arrows"); + if (event.target.checked) { + arrows.setAttribute("visibility", "visible"); + } else { + arrows.setAttribute("visibility", "hidden"); + } +} + +window.addEventListener("resize", drawArrows); +document.addEventListener("DOMContentLoaded", function() { + // Whenever we show invocation, locations change, i.e. we + // need to redraw arrows. + document + .querySelector('input[id="showinvocation"]') + .addEventListener("click", drawArrows); + // Hiding irrelevant lines also should cause arrow rerender. + document + .querySelector('input[name="showCounterexample"]') + .addEventListener("change", drawArrows); + document + .querySelector('input[name="showArrows"]') + .addEventListener("change", toggleArrows); + drawArrows(); + // Default highlighting for the last event. + highlightArrowsForSelectedEvent(); +}); +</script> + +<script type='text/javascript'> +var digitMatcher = new RegExp("[0-9]+"); + +var querySelectorAllArray = function(selector) { + return Array.prototype.slice.call( + document.querySelectorAll(selector)); +} + +document.addEventListener("DOMContentLoaded", function() { + querySelectorAllArray(".PathNav > a").forEach( + function(currentValue, currentIndex) { + var hrefValue = currentValue.getAttribute("href"); + currentValue.onclick = function() { + scrollTo(document.querySelector(hrefValue)); + return false; + }; + }); +}); + +var findNum = function() { + var s = document.querySelector(".msg.selected"); + if (!s || s.id == "EndPath") { + return 0; + } + var out = parseInt(digitMatcher.exec(s.id)[0]); + return out; +}; + +var classListAdd = function(el, theClass) { + if(!el.className.baseVal) + el.className += " " + theClass; + else + el.className.baseVal += " " + theClass; +}; + +var classListRemove = function(el, theClass) { + var className = (!el.className.baseVal) ? + el.className : el.className.baseVal; + className = className.replace(" " + theClass, ""); + if(!el.className.baseVal) + el.className = className; + else + el.className.baseVal = className; +}; + +var scrollTo = function(el) { + querySelectorAllArray(".selected").forEach(function(s) { + classListRemove(s, "selected"); + }); + classListAdd(el, "selected"); + window.scrollBy(0, el.getBoundingClientRect().top - + (window.innerHeight / 2)); + highlightArrowsForSelectedEvent(); +}; + +var move = function(num, up, numItems) { + if (num == 1 && up || num == numItems - 1 && !up) { + return 0; + } else if (num == 0 && up) { + return numItems - 1; + } else if (num == 0 && !up) { + return 1 % numItems; + } + return up ? num - 1 : num + 1; +} + +var numToId = function(num) { + if (num == 0) { + return document.getElementById("EndPath") + } + return document.getElementById("Path" + num); +}; + +var navigateTo = function(up) { + var numItems = document.querySelectorAll( + ".line > .msgEvent, .line > .msgControl").length; + var currentSelected = findNum(); + var newSelected = move(currentSelected, up, numItems); + var newEl = numToId(newSelected, numItems); + + // Scroll element into center. + scrollTo(newEl); +}; + +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + // key 'j' + if (event.keyCode == 74) { + navigateTo(/*up=*/false); + // key 'k' + } else if (event.keyCode == 75) { + navigateTo(/*up=*/true); + } else { + return; + } + event.preventDefault(); +}, true); +</script> + +<script type='text/javascript'> + +var toggleHelp = function() { + var hint = document.querySelector("#tooltiphint"); + var attributeName = "hidden"; + if (hint.hasAttribute(attributeName)) { + hint.removeAttribute(attributeName); + } else { + hint.setAttribute("hidden", "true"); + } +}; +window.addEventListener("keydown", function (event) { + if (event.defaultPrevented) { + return; + } + if (event.key == "?") { + toggleHelp(); + } else { + return; + } + event.preventDefault(); +}); +</script> + +<style type="text/css"> + svg { + position:absolute; + top:0; + left:0; + height:100%; + width:100%; + pointer-events: none; + overflow: visible + } + .arrow { + stroke-opacity: 0.2; + stroke-width: 1; + marker-end: url(#arrowhead); + } + + .arrow.selected { + stroke-opacity: 0.6; + stroke-width: 2; + marker-end: url(#arrowheadSelected); + } + + .arrowhead { + orient: auto; + stroke: none; + opacity: 0.6; + fill: blue; + } +</style> +<svg xmlns="http://www.w3.org/2000/svg"> + <defs> + <marker id="arrowheadSelected" class="arrowhead" opacity="0.6" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + <marker id="arrowhead" class="arrowhead" opacity="0.2" + viewBox="0 0 10 10" refX="3" refY="5" + markerWidth="4" markerHeight="4"> + <path d="M 0 0 L 10 5 L 0 10 z" /> + </marker> + </defs> + <g id="arrows" fill="none" stroke="blue" visibility="hidden"> + + </g> +</svg> +<script type='text/javascript'> +const arrowIndices = [ 0,0 ] +</script> +<table class="code" data-fileid="1"> +<tr class="codeline" data-linenumber="1"><td class="num" id="LN1">1</td><td class="line"><span class='comment'>/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 4 -*- */</span></td></tr> +<tr class="codeline" data-linenumber="2"><td class="num" id="LN2">2</td><td class="line"><span class='comment'>/* weather-metar.c - Weather server functions (METAR)</span></td></tr> +<tr class="codeline" data-linenumber="3"><td class="num" id="LN3">3</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="4"><td class="num" id="LN4">4</td><td class="line"> <span class='comment'>* This program is free software; you can redistribute it and/or</span></td></tr> +<tr class="codeline" data-linenumber="5"><td class="num" id="LN5">5</td><td class="line"> <span class='comment'>* modify it under the terms of the GNU General Public License as</span></td></tr> +<tr class="codeline" data-linenumber="6"><td class="num" id="LN6">6</td><td class="line"> <span class='comment'>* published by the Free Software Foundation; either version 2 of the</span></td></tr> +<tr class="codeline" data-linenumber="7"><td class="num" id="LN7">7</td><td class="line"> <span class='comment'>* License, or (at your option) any later version.</span></td></tr> +<tr class="codeline" data-linenumber="8"><td class="num" id="LN8">8</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="9"><td class="num" id="LN9">9</td><td class="line"> <span class='comment'>* This program is distributed in the hope that it will be useful, but</span></td></tr> +<tr class="codeline" data-linenumber="10"><td class="num" id="LN10">10</td><td class="line"> <span class='comment'>* WITHOUT ANY WARRANTY; without even the implied warranty of</span></td></tr> +<tr class="codeline" data-linenumber="11"><td class="num" id="LN11">11</td><td class="line"> <span class='comment'>* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU</span></td></tr> +<tr class="codeline" data-linenumber="12"><td class="num" id="LN12">12</td><td class="line"> <span class='comment'>* General Public License for more details.</span></td></tr> +<tr class="codeline" data-linenumber="13"><td class="num" id="LN13">13</td><td class="line"> <span class='comment'>*</span></td></tr> +<tr class="codeline" data-linenumber="14"><td class="num" id="LN14">14</td><td class="line"> <span class='comment'>* You should have received a copy of the GNU General Public License</span></td></tr> +<tr class="codeline" data-linenumber="15"><td class="num" id="LN15">15</td><td class="line"> <span class='comment'>* along with this program; if not, see</span></td></tr> +<tr class="codeline" data-linenumber="16"><td class="num" id="LN16">16</td><td class="line"> <span class='comment'>* <http://www.gnu.org/licenses/>.</span></td></tr> +<tr class="codeline" data-linenumber="17"><td class="num" id="LN17">17</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="18"><td class="num" id="LN18">18</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="19"><td class="num" id="LN19">19</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_CONFIG_H<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="20"><td class="num" id="LN20">20</td><td class="line"><span class='directive'>#include <config.h></span></td></tr> +<tr class="codeline" data-linenumber="21"><td class="num" id="LN21">21</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="22"><td class="num" id="LN22">22</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="23"><td class="num" id="LN23">23</td><td class="line"><span class='directive'>#include <stdlib.h></span></td></tr> +<tr class="codeline" data-linenumber="24"><td class="num" id="LN24">24</td><td class="line"><span class='directive'>#include <string.h></span></td></tr> +<tr class="codeline" data-linenumber="25"><td class="num" id="LN25">25</td><td class="line"><span class='directive'>#include <sys/types.h></span></td></tr> +<tr class="codeline" data-linenumber="26"><td class="num" id="LN26">26</td><td class="line"><span class='directive'>#include <regex.h></span></td></tr> +<tr class="codeline" data-linenumber="27"><td class="num" id="LN27">27</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="28"><td class="num" id="LN28">28</td><td class="line"><span class='directive'>#define MATEWEATHER_I_KNOW_THIS_IS_UNSTABLE</span></td></tr> +<tr class="codeline" data-linenumber="29"><td class="num" id="LN29">29</td><td class="line"><span class='directive'>#include "weather.h"</span></td></tr> +<tr class="codeline" data-linenumber="30"><td class="num" id="LN30">30</td><td class="line"><span class='directive'>#include "weather-priv.h"</span></td></tr> +<tr class="codeline" data-linenumber="31"><td class="num" id="LN31">31</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="32"><td class="num" id="LN32">32</td><td class="line"><span class='keyword'>enum</span> {</td></tr> +<tr class="codeline" data-linenumber="33"><td class="num" id="LN33">33</td><td class="line"> TIME_RE,</td></tr> +<tr class="codeline" data-linenumber="34"><td class="num" id="LN34">34</td><td class="line"> WIND_RE,</td></tr> +<tr class="codeline" data-linenumber="35"><td class="num" id="LN35">35</td><td class="line"> VIS_RE,</td></tr> +<tr class="codeline" data-linenumber="36"><td class="num" id="LN36">36</td><td class="line"> COND_RE,</td></tr> +<tr class="codeline" data-linenumber="37"><td class="num" id="LN37">37</td><td class="line"> CLOUD_RE,</td></tr> +<tr class="codeline" data-linenumber="38"><td class="num" id="LN38">38</td><td class="line"> TEMP_RE,</td></tr> +<tr class="codeline" data-linenumber="39"><td class="num" id="LN39">39</td><td class="line"> PRES_RE,</td></tr> +<tr class="codeline" data-linenumber="40"><td class="num" id="LN40">40</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="41"><td class="num" id="LN41">41</td><td class="line"> RE_NUM</td></tr> +<tr class="codeline" data-linenumber="42"><td class="num" id="LN42">42</td><td class="line">};</td></tr> +<tr class="codeline" data-linenumber="43"><td class="num" id="LN43">43</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="44"><td class="num" id="LN44">44</td><td class="line"><span class='comment'>/* Return time of weather report as secs since epoch UTC */</span></td></tr> +<tr class="codeline" data-linenumber="45"><td class="num" id="LN45">45</td><td class="line"><span class='keyword'>static</span> time_t</td></tr> +<tr class="codeline" data-linenumber="46"><td class="num" id="LN46">46</td><td class="line">make_time (gint utcDate, gint utcHour, gint utcMin)</td></tr> +<tr class="codeline" data-linenumber="47"><td class="num" id="LN47">47</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="48"><td class="num" id="LN48">48</td><td class="line"> <span class='keyword'>const</span> time_t now = time (<span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="49"><td class="num" id="LN49">49</td><td class="line"> <span class='keyword'>struct</span> tm tm;</td></tr> +<tr class="codeline" data-linenumber="50"><td class="num" id="LN50">50</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="51"><td class="num" id="LN51">51</td><td class="line"> localtime_r (&now, &tm);</td></tr> +<tr class="codeline" data-linenumber="52"><td class="num" id="LN52">52</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="53"><td class="num" id="LN53">53</td><td class="line"> <span class='comment'>/* If last reading took place just before midnight UTC on the</span></td></tr> +<tr class="codeline" data-linenumber="54"><td class="num" id="LN54">54</td><td class="line"> <span class='comment'>* first, adjust the date downward to allow for the month</span></td></tr> +<tr class="codeline" data-linenumber="55"><td class="num" id="LN55">55</td><td class="line"> <span class='comment'>* change-over. This ASSUMES that the reading won't be more than</span></td></tr> +<tr class="codeline" data-linenumber="56"><td class="num" id="LN56">56</td><td class="line"> <span class='comment'>* 24 hrs old! */</span></td></tr> +<tr class="codeline" data-linenumber="57"><td class="num" id="LN57">57</td><td class="line"> <span class='keyword'>if</span> ((utcDate > tm.tm_mday) && (tm.tm_mday == 1)) {</td></tr> +<tr class="codeline" data-linenumber="58"><td class="num" id="LN58">58</td><td class="line"> tm.tm_mday = 0; <span class='comment'>/* mktime knows this is the last day of the previous</span></td></tr> +<tr class="codeline" data-linenumber="59"><td class="num" id="LN59">59</td><td class="line"> <span class='comment'>* month. */</span></td></tr> +<tr class="codeline" data-linenumber="60"><td class="num" id="LN60">60</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="61"><td class="num" id="LN61">61</td><td class="line"> tm.tm_mday = utcDate;</td></tr> +<tr class="codeline" data-linenumber="62"><td class="num" id="LN62">62</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="63"><td class="num" id="LN63">63</td><td class="line"> tm.tm_hour = utcHour;</td></tr> +<tr class="codeline" data-linenumber="64"><td class="num" id="LN64">64</td><td class="line"> tm.tm_min = utcMin;</td></tr> +<tr class="codeline" data-linenumber="65"><td class="num" id="LN65">65</td><td class="line"> tm.tm_sec = 0;</td></tr> +<tr class="codeline" data-linenumber="66"><td class="num" id="LN66">66</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="67"><td class="num" id="LN67">67</td><td class="line"> <span class='comment'>/* mktime() assumes value is local, not UTC. Use tm_gmtoff to compensate */</span></td></tr> +<tr class="codeline" data-linenumber="68"><td class="num" id="LN68">68</td><td class="line"><span class='directive'>#ifdef <span class='macro'>HAVE_TM_TM_GMOFF<span class='macro_popup'>1</span></span></span></td></tr> +<tr class="codeline" data-linenumber="69"><td class="num" id="LN69">69</td><td class="line"> <span class='keyword'>return</span> tm.tm_gmtoff + mktime (&tm);</td></tr> +<tr class="codeline" data-linenumber="70"><td class="num" id="LN70">70</td><td class="line"><span class='directive'>#elif defined HAVE_TIMEZONE</span></td></tr> +<tr class="codeline" data-linenumber="71"><td class="num" id="LN71">71</td><td class="line"> <span class='keyword'>return</span> timezone + mktime (&tm);</td></tr> +<tr class="codeline" data-linenumber="72"><td class="num" id="LN72">72</td><td class="line"><span class='directive'>#endif</span></td></tr> +<tr class="codeline" data-linenumber="73"><td class="num" id="LN73">73</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="74"><td class="num" id="LN74">74</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="75"><td class="num" id="LN75">75</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="76"><td class="num" id="LN76">76</td><td class="line">metar_tok_time (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="77"><td class="num" id="LN77">77</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="78"><td class="num" id="LN78">78</td><td class="line"> gint day, hr, min;</td></tr> +<tr class="codeline" data-linenumber="79"><td class="num" id="LN79">79</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="80"><td class="num" id="LN80">80</td><td class="line"> sscanf (tokp, <span class='string_literal'>"%2u%2u%2u"</span>, &day, &hr, &min);</td></tr> +<tr class="codeline" data-linenumber="81"><td class="num" id="LN81">81</td><td class="line"> info->update = make_time (day, hr, min);</td></tr> +<tr class="codeline" data-linenumber="82"><td class="num" id="LN82">82</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="83"><td class="num" id="LN83">83</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="84"><td class="num" id="LN84">84</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="85"><td class="num" id="LN85">85</td><td class="line">metar_tok_wind (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="86"><td class="num" id="LN86">86</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="87"><td class="num" id="LN87">87</td><td class="line"> gchar sdir[4], sspd[4], sgust[4];</td></tr> +<tr class="codeline" data-linenumber="88"><td class="num" id="LN88">88</td><td class="line"> gint dir, spd = -1;</td></tr> +<tr class="codeline" data-linenumber="89"><td class="num" id="LN89">89</td><td class="line"> gchar *gustp;</td></tr> +<tr class="codeline" data-linenumber="90"><td class="num" id="LN90">90</td><td class="line"> size_t glen;</td></tr> +<tr class="codeline" data-linenumber="91"><td class="num" id="LN91">91</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="92"><td class="num" id="LN92">92</td><td class="line"> strncpy (sdir, tokp, 3);</td></tr> +<tr class="codeline" data-linenumber="93"><td class="num" id="LN93">93</td><td class="line"> sdir[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="94"><td class="num" id="LN94">94</td><td class="line"> dir = (!strcmp (sdir, <span class='string_literal'>"VRB"</span>)) ? -1 : atoi (sdir);</td></tr> +<tr class="codeline" data-linenumber="95"><td class="num" id="LN95">95</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="96"><td class="num" id="LN96">96</td><td class="line"> memset (sspd, 0, <span class='keyword'>sizeof</span> (sspd));</td></tr> +<tr class="codeline" data-linenumber="97"><td class="num" id="LN97">97</td><td class="line"> glen = strspn (tokp + 3, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>);</td></tr> +<tr class="codeline" data-linenumber="98"><td class="num" id="LN98">98</td><td class="line"> strncpy (sspd, tokp + 3, glen);</td></tr> +<tr class="codeline" data-linenumber="99"><td class="num" id="LN99">99</td><td class="line"> spd = atoi (sspd);</td></tr> +<tr class="codeline" data-linenumber="100"><td class="num" id="LN100">100</td><td class="line"> tokp += glen + 3;</td></tr> +<tr class="codeline" data-linenumber="101"><td class="num" id="LN101">101</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="102"><td class="num" id="LN102">102</td><td class="line"> gustp = strchr (tokp, 'G');</td></tr> +<tr class="codeline" data-linenumber="103"><td class="num" id="LN103">103</td><td class="line"> <span class='keyword'>if</span> (gustp) {</td></tr> +<tr class="codeline" data-linenumber="104"><td class="num" id="LN104">104</td><td class="line"> memset (sgust, 0, <span class='keyword'>sizeof</span> (sgust));</td></tr> +<tr class="codeline" data-linenumber="105"><td class="num" id="LN105">105</td><td class="line"> glen = strspn (gustp + 1, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>);</td></tr> +<tr class="codeline" data-linenumber="106"><td class="num" id="LN106">106</td><td class="line"> strncpy (sgust, gustp + 1, glen);</td></tr> +<tr class="codeline" data-linenumber="107"><td class="num" id="LN107">107</td><td class="line"> tokp = gustp + 1 + glen;</td></tr> +<tr class="codeline" data-linenumber="108"><td class="num" id="LN108">108</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="109"><td class="num" id="LN109">109</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="110"><td class="num" id="LN110">110</td><td class="line"> <span class='keyword'>if</span> (!strcmp (tokp, <span class='string_literal'>"MPS"</span>))</td></tr> +<tr class="codeline" data-linenumber="111"><td class="num" id="LN111">111</td><td class="line"> info->windspeed = <span class='macro'>WINDSPEED_MS_TO_KNOTS ((WeatherWindSpeed)spd)<span class='macro_popup'>(((WeatherWindSpeed)spd) / 0.514444)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="112"><td class="num" id="LN112">112</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="113"><td class="num" id="LN113">113</td><td class="line"> info->windspeed = (WeatherWindSpeed)spd;</td></tr> +<tr class="codeline" data-linenumber="114"><td class="num" id="LN114">114</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="115"><td class="num" id="LN115">115</td><td class="line"> <span class='keyword'>if</span> ((349 <= dir) || (dir <= 11))</td></tr> +<tr class="codeline" data-linenumber="116"><td class="num" id="LN116">116</td><td class="line"> info->wind = WIND_N;</td></tr> +<tr class="codeline" data-linenumber="117"><td class="num" id="LN117">117</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((12 <= dir) && (dir <= 33))</td></tr> +<tr class="codeline" data-linenumber="118"><td class="num" id="LN118">118</td><td class="line"> info->wind = WIND_NNE;</td></tr> +<tr class="codeline" data-linenumber="119"><td class="num" id="LN119">119</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((34 <= dir) && (dir <= 56))</td></tr> +<tr class="codeline" data-linenumber="120"><td class="num" id="LN120">120</td><td class="line"> info->wind = WIND_NE;</td></tr> +<tr class="codeline" data-linenumber="121"><td class="num" id="LN121">121</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((57 <= dir) && (dir <= 78))</td></tr> +<tr class="codeline" data-linenumber="122"><td class="num" id="LN122">122</td><td class="line"> info->wind = WIND_ENE;</td></tr> +<tr class="codeline" data-linenumber="123"><td class="num" id="LN123">123</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((79 <= dir) && (dir <= 101))</td></tr> +<tr class="codeline" data-linenumber="124"><td class="num" id="LN124">124</td><td class="line"> info->wind = WIND_E;</td></tr> +<tr class="codeline" data-linenumber="125"><td class="num" id="LN125">125</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((102 <= dir) && (dir <= 123))</td></tr> +<tr class="codeline" data-linenumber="126"><td class="num" id="LN126">126</td><td class="line"> info->wind = WIND_ESE;</td></tr> +<tr class="codeline" data-linenumber="127"><td class="num" id="LN127">127</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((124 <= dir) && (dir <= 146))</td></tr> +<tr class="codeline" data-linenumber="128"><td class="num" id="LN128">128</td><td class="line"> info->wind = WIND_SE;</td></tr> +<tr class="codeline" data-linenumber="129"><td class="num" id="LN129">129</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((147 <= dir) && (dir <= 168))</td></tr> +<tr class="codeline" data-linenumber="130"><td class="num" id="LN130">130</td><td class="line"> info->wind = WIND_SSE;</td></tr> +<tr class="codeline" data-linenumber="131"><td class="num" id="LN131">131</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((169 <= dir) && (dir <= 191))</td></tr> +<tr class="codeline" data-linenumber="132"><td class="num" id="LN132">132</td><td class="line"> info->wind = WIND_S;</td></tr> +<tr class="codeline" data-linenumber="133"><td class="num" id="LN133">133</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((192 <= dir) && (dir <= 213))</td></tr> +<tr class="codeline" data-linenumber="134"><td class="num" id="LN134">134</td><td class="line"> info->wind = WIND_SSW;</td></tr> +<tr class="codeline" data-linenumber="135"><td class="num" id="LN135">135</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((214 <= dir) && (dir <= 236))</td></tr> +<tr class="codeline" data-linenumber="136"><td class="num" id="LN136">136</td><td class="line"> info->wind = WIND_SW;</td></tr> +<tr class="codeline" data-linenumber="137"><td class="num" id="LN137">137</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((237 <= dir) && (dir <= 258))</td></tr> +<tr class="codeline" data-linenumber="138"><td class="num" id="LN138">138</td><td class="line"> info->wind = WIND_WSW;</td></tr> +<tr class="codeline" data-linenumber="139"><td class="num" id="LN139">139</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((259 <= dir) && (dir <= 281))</td></tr> +<tr class="codeline" data-linenumber="140"><td class="num" id="LN140">140</td><td class="line"> info->wind = WIND_W;</td></tr> +<tr class="codeline" data-linenumber="141"><td class="num" id="LN141">141</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((282 <= dir) && (dir <= 303))</td></tr> +<tr class="codeline" data-linenumber="142"><td class="num" id="LN142">142</td><td class="line"> info->wind = WIND_WNW;</td></tr> +<tr class="codeline" data-linenumber="143"><td class="num" id="LN143">143</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((304 <= dir) && (dir <= 326))</td></tr> +<tr class="codeline" data-linenumber="144"><td class="num" id="LN144">144</td><td class="line"> info->wind = WIND_NW;</td></tr> +<tr class="codeline" data-linenumber="145"><td class="num" id="LN145">145</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> ((327 <= dir) && (dir <= 348))</td></tr> +<tr class="codeline" data-linenumber="146"><td class="num" id="LN146">146</td><td class="line"> info->wind = WIND_NNW;</td></tr> +<tr class="codeline" data-linenumber="147"><td class="num" id="LN147">147</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="148"><td class="num" id="LN148">148</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="149"><td class="num" id="LN149">149</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="150"><td class="num" id="LN150">150</td><td class="line">metar_tok_vis (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="151"><td class="num" id="LN151">151</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="152"><td class="num" id="LN152">152</td><td class="line"> gchar *pfrac, *pend, *psp;</td></tr> +<tr class="codeline" data-linenumber="153"><td class="num" id="LN153">153</td><td class="line"> gchar sval[6];</td></tr> +<tr class="codeline" data-linenumber="154"><td class="num" id="LN154">154</td><td class="line"> gint num, den, val;</td></tr> +<tr class="codeline" data-linenumber="155"><td class="num" id="LN155">155</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="156"><td class="num" id="LN156">156</td><td class="line"> memset (sval, 0, <span class='keyword'>sizeof</span> (sval));</td></tr> +<tr class="codeline" data-linenumber="157"><td class="num" id="LN157">157</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="158"><td class="num" id="LN158">158</td><td class="line"> <span class='keyword'>if</span> (!strcmp (tokp,<span class='string_literal'>"CAVOK"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="159"><td class="num" id="LN159">159</td><td class="line"> <span class='comment'>// "Ceiling And Visibility OK": visibility >= 10 KM</span></td></tr> +<tr class="codeline" data-linenumber="160"><td class="num" id="LN160">160</td><td class="line"> info->visibility=10000. / <span class='macro'>VISIBILITY_SM_TO_M (1.)<span class='macro_popup'>(((1.) * 1.609344) * 1000)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="161"><td class="num" id="LN161">161</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="162"><td class="num" id="LN162">162</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (0 != (pend = strstr (tokp, <span class='string_literal'>"SM"</span>))) {</td></tr> +<tr class="codeline" data-linenumber="163"><td class="num" id="LN163">163</td><td class="line"> <span class='comment'>// US observation: field ends with "SM"</span></td></tr> +<tr class="codeline" data-linenumber="164"><td class="num" id="LN164">164</td><td class="line"> pfrac = strchr (tokp, '/');</td></tr> +<tr class="codeline" data-linenumber="165"><td class="num" id="LN165">165</td><td class="line"> <span class='keyword'>if</span> (pfrac) {</td></tr> +<tr class="codeline" data-linenumber="166"><td class="num" id="LN166">166</td><td class="line"> <span class='keyword'>if</span> (*tokp == 'M') {</td></tr> +<tr class="codeline" data-linenumber="167"><td class="num" id="LN167">167</td><td class="line"> info->visibility = 0.001;</td></tr> +<tr class="codeline" data-linenumber="168"><td class="num" id="LN168">168</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="169"><td class="num" id="LN169">169</td><td class="line"> num = (*(pfrac - 1) - '0');</td></tr> +<tr class="codeline" data-linenumber="170"><td class="num" id="LN170">170</td><td class="line"> strncpy (sval, pfrac + 1, pend - pfrac - 1);</td></tr> +<tr class="codeline" data-linenumber="171"><td class="num" id="LN171">171</td><td class="line"> den = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="172"><td class="num" id="LN172">172</td><td class="line"> info->visibility =</td></tr> +<tr class="codeline" data-linenumber="173"><td class="num" id="LN173">173</td><td class="line"> ((WeatherVisibility)num / ((WeatherVisibility)den));</td></tr> +<tr class="codeline" data-linenumber="174"><td class="num" id="LN174">174</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="175"><td class="num" id="LN175">175</td><td class="line"> psp = strchr (tokp, ' ');</td></tr> +<tr class="codeline" data-linenumber="176"><td class="num" id="LN176">176</td><td class="line"> <span class='keyword'>if</span> (psp) {</td></tr> +<tr class="codeline" data-linenumber="177"><td class="num" id="LN177">177</td><td class="line"> *psp = '\0';</td></tr> +<tr class="codeline" data-linenumber="178"><td class="num" id="LN178">178</td><td class="line"> val = atoi (tokp);</td></tr> +<tr class="codeline" data-linenumber="179"><td class="num" id="LN179">179</td><td class="line"> info->visibility += (WeatherVisibility)val;</td></tr> +<tr class="codeline" data-linenumber="180"><td class="num" id="LN180">180</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="181"><td class="num" id="LN181">181</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="182"><td class="num" id="LN182">182</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="183"><td class="num" id="LN183">183</td><td class="line"> strncpy (sval, tokp, pend - tokp);</td></tr> +<tr class="codeline" data-linenumber="184"><td class="num" id="LN184">184</td><td class="line"> val = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="185"><td class="num" id="LN185">185</td><td class="line"> info->visibility = (WeatherVisibility)val;</td></tr> +<tr class="codeline" data-linenumber="186"><td class="num" id="LN186">186</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="187"><td class="num" id="LN187">187</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="188"><td class="num" id="LN188">188</td><td class="line"> <span class='comment'>// International observation: NNNN(DD NNNNDD)?</span></td></tr> +<tr class="codeline" data-linenumber="189"><td class="num" id="LN189">189</td><td class="line"> <span class='comment'>// For now: use only the minimum visibility and ignore its direction</span></td></tr> +<tr class="codeline" data-linenumber="190"><td class="num" id="LN190">190</td><td class="line"> strncpy (sval, tokp, strspn (tokp, <span class='macro'>CONST_DIGITS<span class='macro_popup'>"0123456789"</span></span>));</td></tr> +<tr class="codeline" data-linenumber="191"><td class="num" id="LN191">191</td><td class="line"> val = atoi (sval);</td></tr> +<tr class="codeline" data-linenumber="192"><td class="num" id="LN192">192</td><td class="line"> info->visibility = (WeatherVisibility)val / <span class='macro'>VISIBILITY_SM_TO_M (1.)<span class='macro_popup'>(((1.) * 1.609344) * 1000)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="193"><td class="num" id="LN193">193</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="194"><td class="num" id="LN194">194</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="195"><td class="num" id="LN195">195</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="196"><td class="num" id="LN196">196</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="197"><td class="num" id="LN197">197</td><td class="line">metar_tok_cloud (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="198"><td class="num" id="LN198">198</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="199"><td class="num" id="LN199">199</td><td class="line"> gchar stype[4], salt[4];</td></tr> +<tr class="codeline" data-linenumber="200"><td class="num" id="LN200">200</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="201"><td class="num" id="LN201">201</td><td class="line"> strncpy (stype, tokp, 3);</td></tr> +<tr class="codeline" data-linenumber="202"><td class="num" id="LN202">202</td><td class="line"> stype[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="203"><td class="num" id="LN203">203</td><td class="line"> <span class='keyword'>if</span> (strlen (tokp) == 6) {</td></tr> +<tr class="codeline" data-linenumber="204"><td class="num" id="LN204">204</td><td class="line"> strncpy (salt, tokp + 3, 3);</td></tr> +<tr class="codeline" data-linenumber="205"><td class="num" id="LN205">205</td><td class="line"> salt[3] = 0;</td></tr> +<tr class="codeline" data-linenumber="206"><td class="num" id="LN206">206</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="207"><td class="num" id="LN207">207</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="208"><td class="num" id="LN208">208</td><td class="line"> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"CLR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="209"><td class="num" id="LN209">209</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="210"><td class="num" id="LN210">210</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"SKC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="211"><td class="num" id="LN211">211</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="212"><td class="num" id="LN212">212</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"NSC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="213"><td class="num" id="LN213">213</td><td class="line"> info->sky = SKY_CLEAR;</td></tr> +<tr class="codeline" data-linenumber="214"><td class="num" id="LN214">214</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"BKN"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="215"><td class="num" id="LN215">215</td><td class="line"> info->sky = SKY_BROKEN;</td></tr> +<tr class="codeline" data-linenumber="216"><td class="num" id="LN216">216</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"SCT"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="217"><td class="num" id="LN217">217</td><td class="line"> info->sky = SKY_SCATTERED;</td></tr> +<tr class="codeline" data-linenumber="218"><td class="num" id="LN218">218</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"FEW"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="219"><td class="num" id="LN219">219</td><td class="line"> info->sky = SKY_FEW;</td></tr> +<tr class="codeline" data-linenumber="220"><td class="num" id="LN220">220</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (stype, <span class='string_literal'>"OVC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="221"><td class="num" id="LN221">221</td><td class="line"> info->sky = SKY_OVERCAST;</td></tr> +<tr class="codeline" data-linenumber="222"><td class="num" id="LN222">222</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="223"><td class="num" id="LN223">223</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="224"><td class="num" id="LN224">224</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="225"><td class="num" id="LN225">225</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="226"><td class="num" id="LN226">226</td><td class="line">metar_tok_pres (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="227"><td class="num" id="LN227">227</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="228"><td class="num" id="LN228">228</td><td class="line"> <span class='keyword'>if</span> (*tokp == 'A') {</td></tr> +<tr class="codeline" data-linenumber="229"><td class="num" id="LN229">229</td><td class="line"> gchar sintg[3], sfract[3];</td></tr> +<tr class="codeline" data-linenumber="230"><td class="num" id="LN230">230</td><td class="line"> gint intg, fract;</td></tr> +<tr class="codeline" data-linenumber="231"><td class="num" id="LN231">231</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="232"><td class="num" id="LN232">232</td><td class="line"> strncpy (sintg, tokp + 1, 2);</td></tr> +<tr class="codeline" data-linenumber="233"><td class="num" id="LN233">233</td><td class="line"> sintg[2] = 0;</td></tr> +<tr class="codeline" data-linenumber="234"><td class="num" id="LN234">234</td><td class="line"> intg = atoi (sintg);</td></tr> +<tr class="codeline" data-linenumber="235"><td class="num" id="LN235">235</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="236"><td class="num" id="LN236">236</td><td class="line"> strncpy (sfract, tokp + 3, 2);</td></tr> +<tr class="codeline" data-linenumber="237"><td class="num" id="LN237">237</td><td class="line"> sfract[2] = 0;</td></tr> +<tr class="codeline" data-linenumber="238"><td class="num" id="LN238">238</td><td class="line"> fract = atoi (sfract);</td></tr> +<tr class="codeline" data-linenumber="239"><td class="num" id="LN239">239</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="240"><td class="num" id="LN240">240</td><td class="line"> info->pressure = (WeatherPressure)intg + (((WeatherPressure)fract)/100.0);</td></tr> +<tr class="codeline" data-linenumber="241"><td class="num" id="LN241">241</td><td class="line"> } <span class='keyword'>else</span> { <span class='comment'>/* *tokp == 'Q' */</span></td></tr> +<tr class="codeline" data-linenumber="242"><td class="num" id="LN242">242</td><td class="line"> gchar spres[5];</td></tr> +<tr class="codeline" data-linenumber="243"><td class="num" id="LN243">243</td><td class="line"> gint pres;</td></tr> +<tr class="codeline" data-linenumber="244"><td class="num" id="LN244">244</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="245"><td class="num" id="LN245">245</td><td class="line"> strncpy (spres, tokp + 1, 4);</td></tr> +<tr class="codeline" data-linenumber="246"><td class="num" id="LN246">246</td><td class="line"> spres[4] = 0;</td></tr> +<tr class="codeline" data-linenumber="247"><td class="num" id="LN247">247</td><td class="line"> pres = atoi (spres);</td></tr> +<tr class="codeline" data-linenumber="248"><td class="num" id="LN248">248</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="249"><td class="num" id="LN249">249</td><td class="line"> info->pressure = <span class='macro'>PRESSURE_MBAR_TO_INCH ((WeatherPressure)pres)<span class='macro_popup'>(((WeatherPressure)pres) * 0.029533373)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="250"><td class="num" id="LN250">250</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="251"><td class="num" id="LN251">251</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="252"><td class="num" id="LN252">252</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="253"><td class="num" id="LN253">253</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="254"><td class="num" id="LN254">254</td><td class="line">metar_tok_temp (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="255"><td class="num" id="LN255">255</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="256"><td class="num" id="LN256">256</td><td class="line"> gchar *ptemp, *pdew, *psep;</td></tr> +<tr class="codeline" data-linenumber="257"><td class="num" id="LN257">257</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="258"><td class="num" id="LN258">258</td><td class="line"> psep = strchr (tokp, '/');</td></tr> +<tr class="codeline" data-linenumber="259"><td class="num" id="LN259">259</td><td class="line"> *psep = 0;</td></tr> +<tr class="codeline" data-linenumber="260"><td class="num" id="LN260">260</td><td class="line"> ptemp = tokp;</td></tr> +<tr class="codeline" data-linenumber="261"><td class="num" id="LN261">261</td><td class="line"> pdew = psep + 1;</td></tr> +<tr class="codeline" data-linenumber="262"><td class="num" id="LN262">262</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="263"><td class="num" id="LN263">263</td><td class="line"> info->temp = (*ptemp == 'M') ? <span class='macro'>TEMP_C_TO_F (-atoi (ptemp + 1))<span class='macro_popup'>(((-atoi (ptemp + 1)) * (9.0/5.0)) + 32.0)</span></span></td></tr> +<tr class="codeline" data-linenumber="264"><td class="num" id="LN264">264</td><td class="line"> : <span class='macro'>TEMP_C_TO_F (atoi (ptemp))<span class='macro_popup'>(((atoi (ptemp)) * (9.0/5.0)) + 32.0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="265"><td class="num" id="LN265">265</td><td class="line"> <span class='keyword'>if</span> (*pdew) {</td></tr> +<tr class="codeline" data-linenumber="266"><td class="num" id="LN266">266</td><td class="line"> info->dew = (*pdew == 'M') ? <span class='macro'>TEMP_C_TO_F (-atoi (pdew + 1))<span class='macro_popup'>(((-atoi (pdew + 1)) * (9.0/5.0)) + 32.0)</span></span></td></tr> +<tr class="codeline" data-linenumber="267"><td class="num" id="LN267">267</td><td class="line"> : <span class='macro'>TEMP_C_TO_F (atoi (pdew))<span class='macro_popup'>(((atoi (pdew)) * (9.0/5.0)) + 32.0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="268"><td class="num" id="LN268">268</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="269"><td class="num" id="LN269">269</td><td class="line"> info->dew = -1000.0;</td></tr> +<tr class="codeline" data-linenumber="270"><td class="num" id="LN270">270</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="271"><td class="num" id="LN271">271</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="272"><td class="num" id="LN272">272</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="273"><td class="num" id="LN273">273</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="274"><td class="num" id="LN274">274</td><td class="line">metar_tok_cond (gchar *tokp, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="275"><td class="num" id="LN275">275</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="276"><td class="num" id="LN276">276</td><td class="line"> gchar squal[3], sphen[4];</td></tr> +<tr class="codeline" data-linenumber="277"><td class="num" id="LN277">277</td><td class="line"> gchar *pphen;</td></tr> +<tr class="codeline" data-linenumber="278"><td class="num" id="LN278">278</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="279"><td class="num" id="LN279">279</td><td class="line"> <span class='keyword'>if</span> ((strlen (tokp) > 3) && ((*tokp == '+') || (*tokp == '-')))</td></tr> +<tr class="codeline" data-linenumber="280"><td class="num" id="LN280">280</td><td class="line"> ++tokp; <span class='comment'>/* FIX */</span></td></tr> +<tr class="codeline" data-linenumber="281"><td class="num" id="LN281">281</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="282"><td class="num" id="LN282">282</td><td class="line"> <span class='keyword'>if</span> ((*tokp == '+') || (*tokp == '-'))</td></tr> +<tr class="codeline" data-linenumber="283"><td class="num" id="LN283">283</td><td class="line"> pphen = tokp + 1;</td></tr> +<tr class="codeline" data-linenumber="284"><td class="num" id="LN284">284</td><td class="line"> <span class='keyword'>else</span> <span class='keyword'>if</span> (strlen (tokp) < 4)</td></tr> +<tr class="codeline" data-linenumber="285"><td class="num" id="LN285">285</td><td class="line"> pphen = tokp;</td></tr> +<tr class="codeline" data-linenumber="286"><td class="num" id="LN286">286</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="287"><td class="num" id="LN287">287</td><td class="line"> pphen = tokp + 2;</td></tr> +<tr class="codeline" data-linenumber="288"><td class="num" id="LN288">288</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="289"><td class="num" id="LN289">289</td><td class="line"> memset (squal, 0, <span class='keyword'>sizeof</span> (squal));</td></tr> +<tr class="codeline" data-linenumber="290"><td class="num" id="LN290">290</td><td class="line"> strncpy (squal, tokp, pphen - tokp);</td></tr> +<tr class="codeline" data-linenumber="291"><td class="num" id="LN291">291</td><td class="line"> squal[pphen - tokp] = 0;</td></tr> +<tr class="codeline" data-linenumber="292"><td class="num" id="LN292">292</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="293"><td class="num" id="LN293">293</td><td class="line"> memset (sphen, 0, <span class='keyword'>sizeof</span> (sphen));</td></tr> +<tr class="codeline" data-linenumber="294"><td class="num" id="LN294">294</td><td class="line"> strncpy (sphen, pphen, <span class='keyword'>sizeof</span> (sphen));</td></tr> +<tr class="codeline" data-linenumber="295"><td class="num" id="LN295">295</td><td class="line"> sphen[<span class='keyword'>sizeof</span> (sphen)-1] = '\0';</td></tr> +<tr class="codeline" data-linenumber="296"><td class="num" id="LN296">296</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="297"><td class="num" id="LN297">297</td><td class="line"> <span class='comment'>/* Defaults */</span></td></tr> +<tr class="codeline" data-linenumber="298"><td class="num" id="LN298">298</td><td class="line"> info->cond.qualifier = QUALIFIER_NONE;</td></tr> +<tr class="codeline" data-linenumber="299"><td class="num" id="LN299">299</td><td class="line"> info->cond.phenomenon = PHENOMENON_NONE;</td></tr> +<tr class="codeline" data-linenumber="300"><td class="num" id="LN300">300</td><td class="line"> info->cond.significant = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="301"><td class="num" id="LN301">301</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="302"><td class="num" id="LN302">302</td><td class="line"> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>""</span>)) {</td></tr> +<tr class="codeline" data-linenumber="303"><td class="num" id="LN303">303</td><td class="line"> info->cond.qualifier = QUALIFIER_MODERATE;</td></tr> +<tr class="codeline" data-linenumber="304"><td class="num" id="LN304">304</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"-"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="305"><td class="num" id="LN305">305</td><td class="line"> info->cond.qualifier = QUALIFIER_LIGHT;</td></tr> +<tr class="codeline" data-linenumber="306"><td class="num" id="LN306">306</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"+"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="307"><td class="num" id="LN307">307</td><td class="line"> info->cond.qualifier = QUALIFIER_HEAVY;</td></tr> +<tr class="codeline" data-linenumber="308"><td class="num" id="LN308">308</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"VC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="309"><td class="num" id="LN309">309</td><td class="line"> info->cond.qualifier = QUALIFIER_VICINITY;</td></tr> +<tr class="codeline" data-linenumber="310"><td class="num" id="LN310">310</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"MI"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="311"><td class="num" id="LN311">311</td><td class="line"> info->cond.qualifier = QUALIFIER_SHALLOW;</td></tr> +<tr class="codeline" data-linenumber="312"><td class="num" id="LN312">312</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"BC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="313"><td class="num" id="LN313">313</td><td class="line"> info->cond.qualifier = QUALIFIER_PATCHES;</td></tr> +<tr class="codeline" data-linenumber="314"><td class="num" id="LN314">314</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"PR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="315"><td class="num" id="LN315">315</td><td class="line"> info->cond.qualifier = QUALIFIER_PARTIAL;</td></tr> +<tr class="codeline" data-linenumber="316"><td class="num" id="LN316">316</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"TS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="317"><td class="num" id="LN317">317</td><td class="line"> info->cond.qualifier = QUALIFIER_THUNDERSTORM;</td></tr> +<tr class="codeline" data-linenumber="318"><td class="num" id="LN318">318</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"BL"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="319"><td class="num" id="LN319">319</td><td class="line"> info->cond.qualifier = QUALIFIER_BLOWING;</td></tr> +<tr class="codeline" data-linenumber="320"><td class="num" id="LN320">320</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"SH"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="321"><td class="num" id="LN321">321</td><td class="line"> info->cond.qualifier = QUALIFIER_SHOWERS;</td></tr> +<tr class="codeline" data-linenumber="322"><td class="num" id="LN322">322</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"DR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="323"><td class="num" id="LN323">323</td><td class="line"> info->cond.qualifier = QUALIFIER_DRIFTING;</td></tr> +<tr class="codeline" data-linenumber="324"><td class="num" id="LN324">324</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (squal, <span class='string_literal'>"FZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="325"><td class="num" id="LN325">325</td><td class="line"> info->cond.qualifier = QUALIFIER_FREEZING;</td></tr> +<tr class="codeline" data-linenumber="326"><td class="num" id="LN326">326</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="327"><td class="num" id="LN327">327</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="328"><td class="num" id="LN328">328</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="329"><td class="num" id="LN329">329</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="330"><td class="num" id="LN330">330</td><td class="line"> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="331"><td class="num" id="LN331">331</td><td class="line"> info->cond.phenomenon = PHENOMENON_DRIZZLE;</td></tr> +<tr class="codeline" data-linenumber="332"><td class="num" id="LN332">332</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"RA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="333"><td class="num" id="LN333">333</td><td class="line"> info->cond.phenomenon = PHENOMENON_RAIN;</td></tr> +<tr class="codeline" data-linenumber="334"><td class="num" id="LN334">334</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SN"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="335"><td class="num" id="LN335">335</td><td class="line"> info->cond.phenomenon = PHENOMENON_SNOW;</td></tr> +<tr class="codeline" data-linenumber="336"><td class="num" id="LN336">336</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SG"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="337"><td class="num" id="LN337">337</td><td class="line"> info->cond.phenomenon = PHENOMENON_SNOW_GRAINS;</td></tr> +<tr class="codeline" data-linenumber="338"><td class="num" id="LN338">338</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"IC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="339"><td class="num" id="LN339">339</td><td class="line"> info->cond.phenomenon = PHENOMENON_ICE_CRYSTALS;</td></tr> +<tr class="codeline" data-linenumber="340"><td class="num" id="LN340">340</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PE"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="341"><td class="num" id="LN341">341</td><td class="line"> info->cond.phenomenon = PHENOMENON_ICE_PELLETS;</td></tr> +<tr class="codeline" data-linenumber="342"><td class="num" id="LN342">342</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"GR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="343"><td class="num" id="LN343">343</td><td class="line"> info->cond.phenomenon = PHENOMENON_HAIL;</td></tr> +<tr class="codeline" data-linenumber="344"><td class="num" id="LN344">344</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"GS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="345"><td class="num" id="LN345">345</td><td class="line"> info->cond.phenomenon = PHENOMENON_SMALL_HAIL;</td></tr> +<tr class="codeline" data-linenumber="346"><td class="num" id="LN346">346</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"UP"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="347"><td class="num" id="LN347">347</td><td class="line"> info->cond.phenomenon = PHENOMENON_UNKNOWN_PRECIPITATION;</td></tr> +<tr class="codeline" data-linenumber="348"><td class="num" id="LN348">348</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"BR"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="349"><td class="num" id="LN349">349</td><td class="line"> info->cond.phenomenon = PHENOMENON_MIST;</td></tr> +<tr class="codeline" data-linenumber="350"><td class="num" id="LN350">350</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FG"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="351"><td class="num" id="LN351">351</td><td class="line"> info->cond.phenomenon = PHENOMENON_FOG;</td></tr> +<tr class="codeline" data-linenumber="352"><td class="num" id="LN352">352</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FU"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="353"><td class="num" id="LN353">353</td><td class="line"> info->cond.phenomenon = PHENOMENON_SMOKE;</td></tr> +<tr class="codeline" data-linenumber="354"><td class="num" id="LN354">354</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"VA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="355"><td class="num" id="LN355">355</td><td class="line"> info->cond.phenomenon = PHENOMENON_VOLCANIC_ASH;</td></tr> +<tr class="codeline" data-linenumber="356"><td class="num" id="LN356">356</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SA"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="357"><td class="num" id="LN357">357</td><td class="line"> info->cond.phenomenon = PHENOMENON_SAND;</td></tr> +<tr class="codeline" data-linenumber="358"><td class="num" id="LN358">358</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"HZ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="359"><td class="num" id="LN359">359</td><td class="line"> info->cond.phenomenon = PHENOMENON_HAZE;</td></tr> +<tr class="codeline" data-linenumber="360"><td class="num" id="LN360">360</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PY"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="361"><td class="num" id="LN361">361</td><td class="line"> info->cond.phenomenon = PHENOMENON_SPRAY;</td></tr> +<tr class="codeline" data-linenumber="362"><td class="num" id="LN362">362</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DU"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="363"><td class="num" id="LN363">363</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUST;</td></tr> +<tr class="codeline" data-linenumber="364"><td class="num" id="LN364">364</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SQ"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="365"><td class="num" id="LN365">365</td><td class="line"> info->cond.phenomenon = PHENOMENON_SQUALL;</td></tr> +<tr class="codeline" data-linenumber="366"><td class="num" id="LN366">366</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"SS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="367"><td class="num" id="LN367">367</td><td class="line"> info->cond.phenomenon = PHENOMENON_SANDSTORM;</td></tr> +<tr class="codeline" data-linenumber="368"><td class="num" id="LN368">368</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"DS"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="369"><td class="num" id="LN369">369</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUSTSTORM;</td></tr> +<tr class="codeline" data-linenumber="370"><td class="num" id="LN370">370</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"PO"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="371"><td class="num" id="LN371">371</td><td class="line"> info->cond.phenomenon = PHENOMENON_DUST_WHIRLS;</td></tr> +<tr class="codeline" data-linenumber="372"><td class="num" id="LN372">372</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"+FC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="373"><td class="num" id="LN373">373</td><td class="line"> info->cond.phenomenon = PHENOMENON_TORNADO;</td></tr> +<tr class="codeline" data-linenumber="374"><td class="num" id="LN374">374</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strcmp (sphen, <span class='string_literal'>"FC"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="375"><td class="num" id="LN375">375</td><td class="line"> info->cond.phenomenon = PHENOMENON_FUNNEL_CLOUD;</td></tr> +<tr class="codeline" data-linenumber="376"><td class="num" id="LN376">376</td><td class="line"> } <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="377"><td class="num" id="LN377">377</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="378"><td class="num" id="LN378">378</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="379"><td class="num" id="LN379">379</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="380"><td class="num" id="LN380">380</td><td class="line"> <span class='keyword'>if</span> ((info->cond.qualifier != QUALIFIER_NONE) || (info->cond.phenomenon != PHENOMENON_NONE))</td></tr> +<tr class="codeline" data-linenumber="381"><td class="num" id="LN381">381</td><td class="line"> info->cond.significant = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="382"><td class="num" id="LN382">382</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="383"><td class="num" id="LN383">383</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="384"><td class="num" id="LN384">384</td><td class="line"><span class='directive'>#define <span class='macro'>TIME_RE_STR<span class='macro_popup'>"([0-9]{6})Z"</span></span> "([0-9]{6})Z"</span></td></tr> +<tr class="codeline" data-linenumber="385"><td class="num" id="LN385">385</td><td class="line"><span class='directive'>#define <span class='macro'>WIND_RE_STR<span class='macro_popup'>"(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></span> "(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></td></tr> +<tr class="codeline" data-linenumber="386"><td class="num" id="LN386">386</td><td class="line"><span class='directive'>#define <span class='macro'>VIS_RE_STR<span class='macro_popup'>"((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" "([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|"<br> "CAVOK"</span></span> "((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" \</span></td></tr> +<tr class="codeline" data-linenumber="387"><td class="num" id="LN387">387</td><td class="line"> <span class='directive'>"([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|" \</span></td></tr> +<tr class="codeline" data-linenumber="388"><td class="num" id="LN388">388</td><td class="line"> <span class='directive'>"CAVOK"</span></td></tr> +<tr class="codeline" data-linenumber="389"><td class="num" id="LN389">389</td><td class="line"><span class='directive'>#define <span class='macro'>COND_RE_STR<span class='macro_popup'>"(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></span> "(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></td></tr> +<tr class="codeline" data-linenumber="390"><td class="num" id="LN390">390</td><td class="line"><span class='directive'>#define <span class='macro'>CLOUD_RE_STR<span class='macro_popup'>"((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></span> "((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></td></tr> +<tr class="codeline" data-linenumber="391"><td class="num" id="LN391">391</td><td class="line"><span class='directive'>#define <span class='macro'>TEMP_RE_STR<span class='macro_popup'>"(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></span> "(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></td></tr> +<tr class="codeline" data-linenumber="392"><td class="num" id="LN392">392</td><td class="line"><span class='directive'>#define <span class='macro'>PRES_RE_STR<span class='macro_popup'>"(A|Q)([0-9]{4})"</span></span> "(A|Q)([0-9]{4})"</span></td></tr> +<tr class="codeline" data-linenumber="393"><td class="num" id="LN393">393</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="394"><td class="num" id="LN394">394</td><td class="line"><span class='comment'>/* POSIX regular expressions do not allow us to express "match whole words</span></td></tr> +<tr class="codeline" data-linenumber="395"><td class="num" id="LN395">395</td><td class="line"> <span class='comment'>* only" in a simple way, so we have to wrap them all into</span></td></tr> +<tr class="codeline" data-linenumber="396"><td class="num" id="LN396">396</td><td class="line"> <span class='comment'>* (^| )(...regex...)( |$)</span></td></tr> +<tr class="codeline" data-linenumber="397"><td class="num" id="LN397">397</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="398"><td class="num" id="LN398">398</td><td class="line"><span class='directive'>#define <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> "(^| )("</span></td></tr> +<tr class="codeline" data-linenumber="399"><td class="num" id="LN399">399</td><td class="line"><span class='directive'>#define <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span> ")( |$)"</span></td></tr> +<tr class="codeline" data-linenumber="400"><td class="num" id="LN400">400</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="401"><td class="num" id="LN401">401</td><td class="line"><span class='keyword'>static</span> regex_t metar_re[RE_NUM];</td></tr> +<tr class="codeline" data-linenumber="402"><td class="num" id="LN402">402</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span> (*metar_f[RE_NUM]) (gchar *tokp, WeatherInfo *info);</td></tr> +<tr class="codeline" data-linenumber="403"><td class="num" id="LN403">403</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="404"><td class="num" id="LN404">404</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="405"><td class="num" id="LN405">405</td><td class="line">metar_init_re (<span class='keyword'>void</span>)</td></tr> +<tr class="codeline" data-linenumber="406"><td class="num" id="LN406">406</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="407"><td class="num" id="LN407">407</td><td class="line"> <span class='keyword'>static</span> gboolean initialized = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="408"><td class="num" id="LN408">408</td><td class="line"> <span class='keyword'>if</span> (initialized)</td></tr> +<tr class="codeline" data-linenumber="409"><td class="num" id="LN409">409</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="410"><td class="num" id="LN410">410</td><td class="line"> initialized = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="411"><td class="num" id="LN411">411</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="412"><td class="num" id="LN412">412</td><td class="line"> regcomp (&metar_re[TIME_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>TIME_RE_STR<span class='macro_popup'>"([0-9]{6})Z"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="413"><td class="num" id="LN413">413</td><td class="line"> regcomp (&metar_re[WIND_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>WIND_RE_STR<span class='macro_popup'>"(([0-9]{3})|VRB)([0-9]?[0-9]{2})(G[0-9]?[0-9]{2})?(KT|MPS)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="414"><td class="num" id="LN414">414</td><td class="line"> regcomp (&metar_re[VIS_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>VIS_RE_STR<span class='macro_popup'>"((([0-9]?[0-9])|(M?([12] )?([1357]/1?[0-9])))SM)|" "([0-9]{4}(N|NE|E|SE|S|SW|W|NW( [0-9]{4}(N|NE|E|SE|S|SW|W|NW))?)?)|"<br> "CAVOK"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="415"><td class="num" id="LN415">415</td><td class="line"> regcomp (&metar_re[COND_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>COND_RE_STR<span class='macro_popup'>"(-|\\+)?(VC|MI|BC|PR|TS|BL|SH|DR|FZ)?(DZ|RA|SN|SG|IC|PE|GR|GS|UP|BR|FG|FU|VA|SA|HZ|PY|DU|SQ|SS|DS|PO|\\+?FC)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="416"><td class="num" id="LN416">416</td><td class="line"> regcomp (&metar_re[CLOUD_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>CLOUD_RE_STR<span class='macro_popup'>"((CLR|BKN|SCT|FEW|OVC|SKC|NSC)([0-9]{3}|///)?(CB|TCU|///)?)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="417"><td class="num" id="LN417">417</td><td class="line"> regcomp (&metar_re[TEMP_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>TEMP_RE_STR<span class='macro_popup'>"(M?[0-9][0-9])/(M?(//|[0-9][0-9])?)"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="418"><td class="num" id="LN418">418</td><td class="line"> regcomp (&metar_re[PRES_RE], <span class='macro'>RE_PREFIX<span class='macro_popup'>"(^| )("</span></span> <span class='macro'>PRES_RE_STR<span class='macro_popup'>"(A|Q)([0-9]{4})"</span></span> <span class='macro'>RE_SUFFIX<span class='macro_popup'>")( |$)"</span></span>, <span class='macro'>REG_EXTENDED<span class='macro_popup'>1</span></span>);</td></tr> +<tr class="codeline" data-linenumber="419"><td class="num" id="LN419">419</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="420"><td class="num" id="LN420">420</td><td class="line"> metar_f[TIME_RE] = metar_tok_time;</td></tr> +<tr class="codeline" data-linenumber="421"><td class="num" id="LN421">421</td><td class="line"> metar_f[WIND_RE] = metar_tok_wind;</td></tr> +<tr class="codeline" data-linenumber="422"><td class="num" id="LN422">422</td><td class="line"> metar_f[VIS_RE] = metar_tok_vis;</td></tr> +<tr class="codeline" data-linenumber="423"><td class="num" id="LN423">423</td><td class="line"> metar_f[COND_RE] = metar_tok_cond;</td></tr> +<tr class="codeline" data-linenumber="424"><td class="num" id="LN424">424</td><td class="line"> metar_f[CLOUD_RE] = metar_tok_cloud;</td></tr> +<tr class="codeline" data-linenumber="425"><td class="num" id="LN425">425</td><td class="line"> metar_f[TEMP_RE] = metar_tok_temp;</td></tr> +<tr class="codeline" data-linenumber="426"><td class="num" id="LN426">426</td><td class="line"> metar_f[PRES_RE] = metar_tok_pres;</td></tr> +<tr class="codeline" data-linenumber="427"><td class="num" id="LN427">427</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="428"><td class="num" id="LN428">428</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="429"><td class="num" id="LN429">429</td><td class="line">gboolean</td></tr> +<tr class="codeline" data-linenumber="430"><td class="num" id="LN430">430</td><td class="line">metar_parse (gchar *metar, WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="431"><td class="num" id="LN431">431</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="432"><td class="num" id="LN432">432</td><td class="line"> gchar *p;</td></tr> +<tr class="codeline" data-linenumber="433"><td class="num" id="LN433">433</td><td class="line"> <span class='comment'>//gchar *rmk;</span></td></tr> +<tr class="codeline" data-linenumber="434"><td class="num" id="LN434">434</td><td class="line"> gint i, i2;</td></tr> +<tr class="codeline" data-linenumber="435"><td class="num" id="LN435">435</td><td class="line"> regmatch_t rm, rm2;</td></tr> +<tr class="codeline" data-linenumber="436"><td class="num" id="LN436">436</td><td class="line"> gchar *tokp;</td></tr> +<tr class="codeline" data-linenumber="437"><td class="num" id="LN437">437</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="438"><td class="num" id="LN438">438</td><td class="line"> <span class='macro'>g_return_val_if_fail (info != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_22<br>; if (info != ((void*)0)) _g_boolean_var_22 = 1; else _g_boolean_var_22<br> = 0; _g_boolean_var_22; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="439"><td class="num" id="LN439">439</td><td class="line"> <span class='macro'>g_return_val_if_fail (metar != NULL, FALSE)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_23<br>; if (metar != ((void*)0)) _g_boolean_var_23 = 1; else _g_boolean_var_23<br> = 0; _g_boolean_var_23; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "metar != NULL")<br>; return ((0)); } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="440"><td class="num" id="LN440">440</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="441"><td class="num" id="LN441">441</td><td class="line"> metar_init_re ();</td></tr> +<tr class="codeline" data-linenumber="442"><td class="num" id="LN442">442</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="443"><td class="num" id="LN443">443</td><td class="line"> <span class='comment'>/*</span></td></tr> +<tr class="codeline" data-linenumber="444"><td class="num" id="LN444">444</td><td class="line"> <span class='comment'>* Force parsing to end at "RMK" field. This prevents a subtle</span></td></tr> +<tr class="codeline" data-linenumber="445"><td class="num" id="LN445">445</td><td class="line"> <span class='comment'>* problem when info within the remark happens to match an earlier state</span></td></tr> +<tr class="codeline" data-linenumber="446"><td class="num" id="LN446">446</td><td class="line"> <span class='comment'>* and, as a result, throws off all the remaining expression</span></td></tr> +<tr class="codeline" data-linenumber="447"><td class="num" id="LN447">447</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="448"><td class="num" id="LN448">448</td><td class="line"> <span class='keyword'>if</span> (0 != (p = strstr (metar, <span class='string_literal'>" RMK "</span>))) {</td></tr> +<tr class="codeline" data-linenumber="449"><td class="num" id="LN449">449</td><td class="line"> *p = '\0';</td></tr> +<tr class="codeline" data-linenumber="450"><td class="num" id="LN450">450</td><td class="line"> <span class='comment'>//rmk = p + 5; // uncomment this if RMK data becomes useful</span></td></tr> +<tr class="codeline" data-linenumber="451"><td class="num" id="LN451">451</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="452"><td class="num" id="LN452">452</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="453"><td class="num" id="LN453">453</td><td class="line"> p = metar;</td></tr> +<tr class="codeline" data-linenumber="454"><td class="num" id="LN454">454</td><td class="line"> i = <span class="mrange">TIME_RE</span>;</td></tr> +<tr><td class="num"></td><td class="line"><div id="EndPath" class="msg msgEvent" style="margin-left:5ex">Value stored to 'i' is never read</div></td></tr> +<tr class="codeline" data-linenumber="455"><td class="num" id="LN455">455</td><td class="line"> <span class='keyword'>while</span> (*p) {</td></tr> +<tr class="codeline" data-linenumber="456"><td class="num" id="LN456">456</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="457"><td class="num" id="LN457">457</td><td class="line"> i2 = RE_NUM;</td></tr> +<tr class="codeline" data-linenumber="458"><td class="num" id="LN458">458</td><td class="line"> rm2.rm_so = strlen (p);</td></tr> +<tr class="codeline" data-linenumber="459"><td class="num" id="LN459">459</td><td class="line"> rm2.rm_eo = rm2.rm_so;</td></tr> +<tr class="codeline" data-linenumber="460"><td class="num" id="LN460">460</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="461"><td class="num" id="LN461">461</td><td class="line"> <span class='keyword'>for</span> (i = 0; i < RE_NUM && rm2.rm_so > 0; i++) {</td></tr> +<tr class="codeline" data-linenumber="462"><td class="num" id="LN462">462</td><td class="line"> <span class='keyword'>if</span> (0 == regexec (&metar_re[i], p, 1, &rm, 0)</td></tr> +<tr class="codeline" data-linenumber="463"><td class="num" id="LN463">463</td><td class="line"> && rm.rm_so < rm2.rm_so)</td></tr> +<tr class="codeline" data-linenumber="464"><td class="num" id="LN464">464</td><td class="line"> {</td></tr> +<tr class="codeline" data-linenumber="465"><td class="num" id="LN465">465</td><td class="line"> i2 = i;</td></tr> +<tr class="codeline" data-linenumber="466"><td class="num" id="LN466">466</td><td class="line"> <span class='comment'>/* Skip leading and trailing space characters, if present.</span></td></tr> +<tr class="codeline" data-linenumber="467"><td class="num" id="LN467">467</td><td class="line"> <span class='comment'>(the regular expressions include those characters to</span></td></tr> +<tr class="codeline" data-linenumber="468"><td class="num" id="LN468">468</td><td class="line"> <span class='comment'>only get matches limited to whole words). */</span></td></tr> +<tr class="codeline" data-linenumber="469"><td class="num" id="LN469">469</td><td class="line"> <span class='keyword'>if</span> (p[rm.rm_so] == ' ') rm.rm_so++;</td></tr> +<tr class="codeline" data-linenumber="470"><td class="num" id="LN470">470</td><td class="line"> <span class='keyword'>if</span> (p[rm.rm_eo - 1] == ' ') rm.rm_eo--;</td></tr> +<tr class="codeline" data-linenumber="471"><td class="num" id="LN471">471</td><td class="line"> rm2.rm_so = rm.rm_so;</td></tr> +<tr class="codeline" data-linenumber="472"><td class="num" id="LN472">472</td><td class="line"> rm2.rm_eo = rm.rm_eo;</td></tr> +<tr class="codeline" data-linenumber="473"><td class="num" id="LN473">473</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="474"><td class="num" id="LN474">474</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="475"><td class="num" id="LN475">475</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="476"><td class="num" id="LN476">476</td><td class="line"> <span class='keyword'>if</span> (i2 != RE_NUM) {</td></tr> +<tr class="codeline" data-linenumber="477"><td class="num" id="LN477">477</td><td class="line"> tokp = g_strndup (p + rm2.rm_so, rm2.rm_eo - rm2.rm_so);</td></tr> +<tr class="codeline" data-linenumber="478"><td class="num" id="LN478">478</td><td class="line"> metar_f[i2] (tokp, info);</td></tr> +<tr class="codeline" data-linenumber="479"><td class="num" id="LN479">479</td><td class="line"> g_free (tokp);</td></tr> +<tr class="codeline" data-linenumber="480"><td class="num" id="LN480">480</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="481"><td class="num" id="LN481">481</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="482"><td class="num" id="LN482">482</td><td class="line"> p += rm2.rm_eo;</td></tr> +<tr class="codeline" data-linenumber="483"><td class="num" id="LN483">483</td><td class="line"> p += strspn (p, <span class='string_literal'>" "</span>);</td></tr> +<tr class="codeline" data-linenumber="484"><td class="num" id="LN484">484</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="485"><td class="num" id="LN485">485</td><td class="line"> <span class='keyword'>return</span> <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="486"><td class="num" id="LN486">486</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="487"><td class="num" id="LN487">487</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="488"><td class="num" id="LN488">488</td><td class="line"><span class='keyword'>static</span> <span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="489"><td class="num" id="LN489">489</td><td class="line">metar_finish (SoupSession *session, SoupMessage *msg, gpointer data)</td></tr> +<tr class="codeline" data-linenumber="490"><td class="num" id="LN490">490</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="491"><td class="num" id="LN491">491</td><td class="line"> WeatherInfo *info = (WeatherInfo *)data;</td></tr> +<tr class="codeline" data-linenumber="492"><td class="num" id="LN492">492</td><td class="line"> WeatherLocation *loc;</td></tr> +<tr class="codeline" data-linenumber="493"><td class="num" id="LN493">493</td><td class="line"> <span class='keyword'>const</span> gchar *p, *endtag;</td></tr> +<tr class="codeline" data-linenumber="494"><td class="num" id="LN494">494</td><td class="line"> gchar *searchkey, *metar;</td></tr> +<tr class="codeline" data-linenumber="495"><td class="num" id="LN495">495</td><td class="line"> gboolean success = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="496"><td class="num" id="LN496">496</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="497"><td class="num" id="LN497">497</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_24<br>; if (info != ((void*)0)) _g_boolean_var_24 = 1; else _g_boolean_var_24<br> = 0; _g_boolean_var_24; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="498"><td class="num" id="LN498">498</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="499"><td class="num" id="LN499">499</td><td class="line"> <span class='keyword'>if</span> (!<span class='macro'>SOUP_STATUS_IS_SUCCESSFUL (msg->status_code)<span class='macro_popup'>((msg->status_code) >= 200 && (msg->status_code<br>) < 300)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="500"><td class="num" id="LN500">500</td><td class="line"> <span class='keyword'>if</span> (<span class='macro'>SOUP_STATUS_IS_TRANSPORT_ERROR (msg->status_code)<span class='macro_popup'>((msg->status_code) > 0 && (msg->status_code<br>) < 100)</span></span>)</td></tr> +<tr class="codeline" data-linenumber="501"><td class="num" id="LN501">501</td><td class="line"> info->network_error = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="502"><td class="num" id="LN502">502</td><td class="line"> <span class='keyword'>else</span> {</td></tr> +<tr class="codeline" data-linenumber="503"><td class="num" id="LN503">503</td><td class="line"> <span class='comment'>/* Translators: %d is an error code, and %s the error string */</span></td></tr> +<tr class="codeline" data-linenumber="504"><td class="num" id="LN504">504</td><td class="line"> g_warning (<span class='macro'>_(<span class='string_literal'>"Failed to get METAR data: %d %s.\n"</span>)<span class='macro_popup'>(mateweather_gettext ("Failed to get METAR data: %d %s.\n"))</span></span>,</td></tr> +<tr class="codeline" data-linenumber="505"><td class="num" id="LN505">505</td><td class="line"> msg->status_code, msg->reason_phrase);</td></tr> +<tr class="codeline" data-linenumber="506"><td class="num" id="LN506">506</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="507"><td class="num" id="LN507">507</td><td class="line"> request_done (info, <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="508"><td class="num" id="LN508">508</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="509"><td class="num" id="LN509">509</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="510"><td class="num" id="LN510">510</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="511"><td class="num" id="LN511">511</td><td class="line"> loc = info->location;</td></tr> +<tr class="codeline" data-linenumber="512"><td class="num" id="LN512">512</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="513"><td class="num" id="LN513">513</td><td class="line"> searchkey = g_strdup_printf (<span class='string_literal'>"<raw_text>%s"</span>, loc->code);</td></tr> +<tr class="codeline" data-linenumber="514"><td class="num" id="LN514">514</td><td class="line"> p = strstr (msg->response_body->data, searchkey);</td></tr> +<tr class="codeline" data-linenumber="515"><td class="num" id="LN515">515</td><td class="line"> g_free (searchkey);</td></tr> +<tr class="codeline" data-linenumber="516"><td class="num" id="LN516">516</td><td class="line"> <span class='keyword'>if</span> (p) {</td></tr> +<tr class="codeline" data-linenumber="517"><td class="num" id="LN517">517</td><td class="line"> p += <span class='macro'>WEATHER_LOCATION_CODE_LEN<span class='macro_popup'>4</span></span> + 11;</td></tr> +<tr class="codeline" data-linenumber="518"><td class="num" id="LN518">518</td><td class="line"> endtag = strstr (p, <span class='string_literal'>"</raw_text>"</span>);</td></tr> +<tr class="codeline" data-linenumber="519"><td class="num" id="LN519">519</td><td class="line"> <span class='keyword'>if</span> (endtag)</td></tr> +<tr class="codeline" data-linenumber="520"><td class="num" id="LN520">520</td><td class="line"> metar = g_strndup (p, endtag - p);</td></tr> +<tr class="codeline" data-linenumber="521"><td class="num" id="LN521">521</td><td class="line"> <span class='keyword'>else</span></td></tr> +<tr class="codeline" data-linenumber="522"><td class="num" id="LN522">522</td><td class="line"> metar = <span class='macro'>g_strdup (p)<span class='macro_popup'>g_strdup_inline (p)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="523"><td class="num" id="LN523">523</td><td class="line"> success = metar_parse (metar, info);</td></tr> +<tr class="codeline" data-linenumber="524"><td class="num" id="LN524">524</td><td class="line"> g_free (metar);</td></tr> +<tr class="codeline" data-linenumber="525"><td class="num" id="LN525">525</td><td class="line"> } <span class='keyword'>else</span> <span class='keyword'>if</span> (!strstr (msg->response_body->data, <span class='string_literal'>"aviationweather.gov"</span>)) {</td></tr> +<tr class="codeline" data-linenumber="526"><td class="num" id="LN526">526</td><td class="line"> <span class='comment'>/* The response doesn't even seem to have come from NOAA...</span></td></tr> +<tr class="codeline" data-linenumber="527"><td class="num" id="LN527">527</td><td class="line"> <span class='comment'>* most likely it is a wifi hotspot login page. Call that a</span></td></tr> +<tr class="codeline" data-linenumber="528"><td class="num" id="LN528">528</td><td class="line"> <span class='comment'>* network error.</span></td></tr> +<tr class="codeline" data-linenumber="529"><td class="num" id="LN529">529</td><td class="line"> <span class='comment'>*/</span></td></tr> +<tr class="codeline" data-linenumber="530"><td class="num" id="LN530">530</td><td class="line"> info->network_error = <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>;</td></tr> +<tr class="codeline" data-linenumber="531"><td class="num" id="LN531">531</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="532"><td class="num" id="LN532">532</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="533"><td class="num" id="LN533">533</td><td class="line"> info->valid = success;</td></tr> +<tr class="codeline" data-linenumber="534"><td class="num" id="LN534">534</td><td class="line"> request_done (info, <span class='macro'>TRUE<span class='macro_popup'>(!(0))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="535"><td class="num" id="LN535">535</td><td class="line">}</td></tr> +<tr class="codeline" data-linenumber="536"><td class="num" id="LN536">536</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="537"><td class="num" id="LN537">537</td><td class="line"><span class='comment'>/* Read current conditions and fill in info structure */</span></td></tr> +<tr class="codeline" data-linenumber="538"><td class="num" id="LN538">538</td><td class="line"><span class='keyword'>void</span></td></tr> +<tr class="codeline" data-linenumber="539"><td class="num" id="LN539">539</td><td class="line">metar_start_open (WeatherInfo *info)</td></tr> +<tr class="codeline" data-linenumber="540"><td class="num" id="LN540">540</td><td class="line">{</td></tr> +<tr class="codeline" data-linenumber="541"><td class="num" id="LN541">541</td><td class="line"> WeatherLocation *loc;</td></tr> +<tr class="codeline" data-linenumber="542"><td class="num" id="LN542">542</td><td class="line"> SoupMessage *msg;</td></tr> +<tr class="codeline" data-linenumber="543"><td class="num" id="LN543">543</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="544"><td class="num" id="LN544">544</td><td class="line"> <span class='macro'>g_return_if_fail (info != NULL)<span class='macro_popup'>do { if ((__builtin_expect (__extension__ ({ int _g_boolean_var_25<br>; if (info != ((void*)0)) _g_boolean_var_25 = 1; else _g_boolean_var_25<br> = 0; _g_boolean_var_25; }), 1))) { } else { g_return_if_fail_warning<br> ("MateWeather", ((const char*) (__func__)), "info != NULL");<br> return; } } while (0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="545"><td class="num" id="LN545">545</td><td class="line"> info->valid = info->network_error = <span class='macro'>FALSE<span class='macro_popup'>(0)</span></span>;</td></tr> +<tr class="codeline" data-linenumber="546"><td class="num" id="LN546">546</td><td class="line"> loc = info->location;</td></tr> +<tr class="codeline" data-linenumber="547"><td class="num" id="LN547">547</td><td class="line"> <span class='keyword'>if</span> (loc == <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>) {</td></tr> +<tr class="codeline" data-linenumber="548"><td class="num" id="LN548">548</td><td class="line"> g_warning (<span class='macro'>_(<span class='string_literal'>"WeatherInfo missing location"</span>)<span class='macro_popup'>(mateweather_gettext ("WeatherInfo missing location"))</span></span>);</td></tr> +<tr class="codeline" data-linenumber="549"><td class="num" id="LN549">549</td><td class="line"> <span class='keyword'>return</span>;</td></tr> +<tr class="codeline" data-linenumber="550"><td class="num" id="LN550">550</td><td class="line"> }</td></tr> +<tr class="codeline" data-linenumber="551"><td class="num" id="LN551">551</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="552"><td class="num" id="LN552">552</td><td class="line"> msg = soup_form_request_new (</td></tr> +<tr class="codeline" data-linenumber="553"><td class="num" id="LN553">553</td><td class="line"> <span class='string_literal'>"GET"</span>, <span class='string_literal'>"https://aviationweather.gov/cgi-bin/data/dataserver.php"</span>,</td></tr> +<tr class="codeline" data-linenumber="554"><td class="num" id="LN554">554</td><td class="line"> <span class='string_literal'>"dataSource"</span>, <span class='string_literal'>"metars"</span>,</td></tr> +<tr class="codeline" data-linenumber="555"><td class="num" id="LN555">555</td><td class="line"> <span class='string_literal'>"requestType"</span>, <span class='string_literal'>"retrieve"</span>,</td></tr> +<tr class="codeline" data-linenumber="556"><td class="num" id="LN556">556</td><td class="line"> <span class='string_literal'>"format"</span>, <span class='string_literal'>"xml"</span>,</td></tr> +<tr class="codeline" data-linenumber="557"><td class="num" id="LN557">557</td><td class="line"> <span class='string_literal'>"hoursBeforeNow"</span>, <span class='string_literal'>"3"</span>,</td></tr> +<tr class="codeline" data-linenumber="558"><td class="num" id="LN558">558</td><td class="line"> <span class='string_literal'>"mostRecent"</span>, <span class='string_literal'>"true"</span>,</td></tr> +<tr class="codeline" data-linenumber="559"><td class="num" id="LN559">559</td><td class="line"> <span class='string_literal'>"fields"</span>, <span class='string_literal'>"raw_text"</span>,</td></tr> +<tr class="codeline" data-linenumber="560"><td class="num" id="LN560">560</td><td class="line"> <span class='string_literal'>"stationString"</span>, loc->code,</td></tr> +<tr class="codeline" data-linenumber="561"><td class="num" id="LN561">561</td><td class="line"> <span class='macro'>NULL<span class='macro_popup'>((void*)0)</span></span>);</td></tr> +<tr class="codeline" data-linenumber="562"><td class="num" id="LN562">562</td><td class="line"> soup_session_queue_message (info->session, msg, metar_finish, info);</td></tr> +<tr class="codeline" data-linenumber="563"><td class="num" id="LN563">563</td><td class="line"> </td></tr> +<tr class="codeline" data-linenumber="564"><td class="num" id="LN564">564</td><td class="line"> info->requests_pending++;</td></tr> +<tr class="codeline" data-linenumber="565"><td class="num" id="LN565">565</td><td class="line">}</td></tr> +</table></body></html> diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/scanview.css b/2024-02-14-202956-5881-1@f4ce3914b76b_master/scanview.css new file mode 100644 index 0000000..cf8a5a6 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/scanview.css @@ -0,0 +1,62 @@ +body { color:#000000; background-color:#ffffff } +body { font-family: Helvetica, sans-serif; font-size:9pt } +h1 { font-size: 14pt; } +h2 { font-size: 12pt; } +table { font-size:9pt } +table { border-spacing: 0px; border: 1px solid black } +th, table thead { + background-color:#eee; color:#666666; + font-weight: bold; cursor: default; + text-align:center; + font-weight: bold; font-family: Verdana; + white-space:nowrap; +} +.W { font-size:0px } +th, td { padding:5px; padding-left:8px; text-align:left } +td.SUMM_DESC { padding-left:12px } +td.DESC { white-space:pre } +td.Q { text-align:right } +td { text-align:left } +tbody.scrollContent { overflow:auto } + +table.form_group { + background-color: #ccc; + border: 1px solid #333; + padding: 2px; +} + +table.form_inner_group { + background-color: #ccc; + border: 1px solid #333; + padding: 0px; +} + +table.form { + background-color: #999; + border: 1px solid #333; + padding: 2px; +} + +td.form_label { + text-align: right; + vertical-align: top; +} +/* For one line entires */ +td.form_clabel { + text-align: right; + vertical-align: center; +} +td.form_value { + text-align: left; + vertical-align: top; +} +td.form_submit { + text-align: right; + vertical-align: top; +} + +h1.SubmitFail { + color: #f00; +} +h1.SubmitOk { +} diff --git a/2024-02-14-202956-5881-1@f4ce3914b76b_master/sorttable.js b/2024-02-14-202956-5881-1@f4ce3914b76b_master/sorttable.js new file mode 100644 index 0000000..32faa07 --- /dev/null +++ b/2024-02-14-202956-5881-1@f4ce3914b76b_master/sorttable.js @@ -0,0 +1,492 @@ +/* + SortTable + version 2 + 7th April 2007 + Stuart Langridge, http://www.kryogenix.org/code/browser/sorttable/ + + Instructions: + Download this file + Add <script src="sorttable.js"></script> to your HTML + Add class="sortable" to any table you'd like to make sortable + Click on the headers to sort + + Thanks to many, many people for contributions and suggestions. + Licenced as X11: http://www.kryogenix.org/code/browser/licence.html + This basically means: do what you want with it. +*/ + + +var stIsIE = /*@cc_on!@*/false; + +sorttable = { + init: function() { + // quit if this function has already been called + if (arguments.callee.done) return; + // flag this function so we don't do the same thing twice + arguments.callee.done = true; + // kill the timer + if (_timer) clearInterval(_timer); + + if (!document.createElement || !document.getElementsByTagName) return; + + sorttable.DATE_RE = /^(\d\d?)[\/\.-](\d\d?)[\/\.-]((\d\d)?\d\d)$/; + + forEach(document.getElementsByTagName('table'), function(table) { + if (table.className.search(/\bsortable\b/) != -1) { + sorttable.makeSortable(table); + } + }); + + }, + + makeSortable: function(table) { + if (table.getElementsByTagName('thead').length == 0) { + // table doesn't have a tHead. Since it should have, create one and + // put the first table row in it. + the = document.createElement('thead'); + the.appendChild(table.rows[0]); + table.insertBefore(the,table.firstChild); + } + // Safari doesn't support table.tHead, sigh + if (table.tHead == null) table.tHead = table.getElementsByTagName('thead')[0]; + + if (table.tHead.rows.length != 1) return; // can't cope with two header rows + + // Sorttable v1 put rows with a class of "sortbottom" at the bottom (as + // "total" rows, for example). This is B&R, since what you're supposed + // to do is put them in a tfoot. So, if there are sortbottom rows, + // for backward compatibility, move them to tfoot (creating it if needed). + sortbottomrows = []; + for (var i=0; i<table.rows.length; i++) { + if (table.rows[i].className.search(/\bsortbottom\b/) != -1) { + sortbottomrows[sortbottomrows.length] = table.rows[i]; + } + } + if (sortbottomrows) { + if (table.tFoot == null) { + // table doesn't have a tfoot. Create one. + tfo = document.createElement('tfoot'); + table.appendChild(tfo); + } + for (var i=0; i<sortbottomrows.length; i++) { + tfo.appendChild(sortbottomrows[i]); + } + delete sortbottomrows; + } + + // work through each column and calculate its type + headrow = table.tHead.rows[0].cells; + for (var i=0; i<headrow.length; i++) { + // manually override the type with a sorttable_type attribute + if (!headrow[i].className.match(/\bsorttable_nosort\b/)) { // skip this col + mtch = headrow[i].className.match(/\bsorttable_([a-z0-9]+)\b/); + if (mtch) { override = mtch[1]; } + if (mtch && typeof sorttable["sort_"+override] == 'function') { + headrow[i].sorttable_sortfunction = sorttable["sort_"+override]; + } else { + headrow[i].sorttable_sortfunction = sorttable.guessType(table,i); + } + // make it clickable to sort + headrow[i].sorttable_columnindex = i; + headrow[i].sorttable_tbody = table.tBodies[0]; + dean_addEvent(headrow[i],"click", function(e) { + + if (this.className.search(/\bsorttable_sorted\b/) != -1) { + // if we're already sorted by this column, just + // reverse the table, which is quicker + sorttable.reverse(this.sorttable_tbody); + this.className = this.className.replace('sorttable_sorted', + 'sorttable_sorted_reverse'); + this.removeChild(document.getElementById('sorttable_sortfwdind')); + sortrevind = document.createElement('span'); + sortrevind.id = "sorttable_sortrevind"; + sortrevind.innerHTML = stIsIE ? ' <font face="webdings">5</font>' : ' ▴'; + this.appendChild(sortrevind); + return; + } + if (this.className.search(/\bsorttable_sorted_reverse\b/) != -1) { + // if we're already sorted by this column in reverse, just + // re-reverse the table, which is quicker + sorttable.reverse(this.sorttable_tbody); + this.className = this.className.replace('sorttable_sorted_reverse', + 'sorttable_sorted'); + this.removeChild(document.getElementById('sorttable_sortrevind')); + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"; + sortfwdind.innerHTML = stIsIE ? ' <font face="webdings">6</font>' : ' ▾'; + this.appendChild(sortfwdind); + return; + } + + // remove sorttable_sorted classes + theadrow = this.parentNode; + forEach(theadrow.childNodes, function(cell) { + if (cell.nodeType == 1) { // an element + cell.className = cell.className.replace('sorttable_sorted_reverse',''); + cell.className = cell.className.replace('sorttable_sorted',''); + } + }); + sortfwdind = document.getElementById('sorttable_sortfwdind'); + if (sortfwdind) { sortfwdind.parentNode.removeChild(sortfwdind); } + sortrevind = document.getElementById('sorttable_sortrevind'); + if (sortrevind) { sortrevind.parentNode.removeChild(sortrevind); } + + this.className += ' sorttable_sorted'; + sortfwdind = document.createElement('span'); + sortfwdind.id = "sorttable_sortfwdind"; + sortfwdind.innerHTML = stIsIE ? ' <font face="webdings">6</font>' : ' ▾'; + this.appendChild(sortfwdind); + + // build an array to sort. This is a Schwartzian transform thing, + // i.e., we "decorate" each row with the actual sort key, + // sort based on the sort keys, and then put the rows back in order + // which is a lot faster because you only do getInnerText once per row + row_array = []; + col = this.sorttable_columnindex; + rows = this.sorttable_tbody.rows; + for (var j=0; j<rows.length; j++) { + row_array[row_array.length] = [sorttable.getInnerText(rows[j].cells[col]), rows[j]]; + } + /* If you want a stable sort, uncomment the following line */ + sorttable.shaker_sort(row_array, this.sorttable_sortfunction); + /* and comment out this one */ + //row_array.sort(this.sorttable_sortfunction); + + tb = this.sorttable_tbody; + for (var j=0; j<row_array.length; j++) { + tb.appendChild(row_array[j][1]); + } + + delete row_array; + }); + } + } + }, + + guessType: function(table, column) { + // guess the type of a column based on its first non-blank row + sortfn = sorttable.sort_alpha; + for (var i=0; i<table.tBodies[0].rows.length; i++) { + text = sorttable.getInnerText(table.tBodies[0].rows[i].cells[column]); + if (text != '') { + if (text.match(/^-?[�$�]?[\d,.]+%?$/)) { + return sorttable.sort_numeric; + } + // check for a date: dd/mm/yyyy or dd/mm/yy + // can have / or . or - as separator + // can be mm/dd as well + possdate = text.match(sorttable.DATE_RE) + if (possdate) { + // looks like a date + first = parseInt(possdate[1]); + second = parseInt(possdate[2]); + if (first > 12) { + // definitely dd/mm + return sorttable.sort_ddmm; + } else if (second > 12) { + return sorttable.sort_mmdd; + } else { + // looks like a date, but we can't tell which, so assume + // that it's dd/mm (English imperialism!) and keep looking + sortfn = sorttable.sort_ddmm; + } + } + } + } + return sortfn; + }, + + getInnerText: function(node) { + // gets the text we want to use for sorting for a cell. + // strips leading and trailing whitespace. + // this is *not* a generic getInnerText function; it's special to sorttable. + // for example, you can override the cell text with a customkey attribute. + // it also gets .value for <input> fields. + + hasInputs = (typeof node.getElementsByTagName == 'function') && + node.getElementsByTagName('input').length; + + if (node.getAttribute("sorttable_customkey") != null) { + return node.getAttribute("sorttable_customkey"); + } + else if (typeof node.textContent != 'undefined' && !hasInputs) { + return node.textContent.replace(/^\s+|\s+$/g, ''); + } + else if (typeof node.innerText != 'undefined' && !hasInputs) { + return node.innerText.replace(/^\s+|\s+$/g, ''); + } + else if (typeof node.text != 'undefined' && !hasInputs) { + return node.text.replace(/^\s+|\s+$/g, ''); + } + else { + switch (node.nodeType) { + case 3: + if (node.nodeName.toLowerCase() == 'input') { + return node.value.replace(/^\s+|\s+$/g, ''); + } + case 4: + return node.nodeValue.replace(/^\s+|\s+$/g, ''); + break; + case 1: + case 11: + var innerText = ''; + for (var i = 0; i < node.childNodes.length; i++) { + innerText += sorttable.getInnerText(node.childNodes[i]); + } + return innerText.replace(/^\s+|\s+$/g, ''); + break; + default: + return ''; + } + } + }, + + reverse: function(tbody) { + // reverse the rows in a tbody + newrows = []; + for (var i=0; i<tbody.rows.length; i++) { + newrows[newrows.length] = tbody.rows[i]; + } + for (var i=newrows.length-1; i>=0; i--) { + tbody.appendChild(newrows[i]); + } + delete newrows; + }, + + /* sort functions + each sort function takes two parameters, a and b + you are comparing a[0] and b[0] */ + sort_numeric: function(a,b) { + aa = parseFloat(a[0].replace(/[^0-9.-]/g,'')); + if (isNaN(aa)) aa = 0; + bb = parseFloat(b[0].replace(/[^0-9.-]/g,'')); + if (isNaN(bb)) bb = 0; + return aa-bb; + }, + sort_alpha: function(a,b) { + if (a[0]==b[0]) return 0; + if (a[0]<b[0]) return -1; + return 1; + }, + sort_ddmm: function(a,b) { + mtch = a[0].match(sorttable.DATE_RE); + y = mtch[3]; m = mtch[2]; d = mtch[1]; + if (m.length == 1) m = '0'+m; + if (d.length == 1) d = '0'+d; + dt1 = y+m+d; + mtch = b[0].match(sorttable.DATE_RE); + y = mtch[3]; m = mtch[2]; d = mtch[1]; + if (m.length == 1) m = '0'+m; + if (d.length == 1) d = '0'+d; + dt2 = y+m+d; + if (dt1==dt2) return 0; + if (dt1<dt2) return -1; + return 1; + }, + sort_mmdd: function(a,b) { + mtch = a[0].match(sorttable.DATE_RE); + y = mtch[3]; d = mtch[2]; m = mtch[1]; + if (m.length == 1) m = '0'+m; + if (d.length == 1) d = '0'+d; + dt1 = y+m+d; + mtch = b[0].match(sorttable.DATE_RE); + y = mtch[3]; d = mtch[2]; m = mtch[1]; + if (m.length == 1) m = '0'+m; + if (d.length == 1) d = '0'+d; + dt2 = y+m+d; + if (dt1==dt2) return 0; + if (dt1<dt2) return -1; + return 1; + }, + + shaker_sort: function(list, comp_func) { + // A stable sort function to allow multi-level sorting of data + // see: http://en.wikipedia.org/wiki/Cocktail_sort + // thanks to Joseph Nahmias + var b = 0; + var t = list.length - 1; + var swap = true; + + while(swap) { + swap = false; + for(var i = b; i < t; ++i) { + if ( comp_func(list[i], list[i+1]) > 0 ) { + var q = list[i]; list[i] = list[i+1]; list[i+1] = q; + swap = true; + } + } // for + t--; + + if (!swap) break; + + for(var i = t; i > b; --i) { + if ( comp_func(list[i], list[i-1]) < 0 ) { + var q = list[i]; list[i] = list[i-1]; list[i-1] = q; + swap = true; + } + } // for + b++; + + } // while(swap) + } +} + +/* ****************************************************************** + Supporting functions: bundled here to avoid depending on a library + ****************************************************************** */ + +// Dean Edwards/Matthias Miller/John Resig + +/* for Mozilla/Opera9 */ +if (document.addEventListener) { + document.addEventListener("DOMContentLoaded", sorttable.init, false); +} + +/* for Internet Explorer */ +/*@cc_on @*/ +/*@if (@_win32) + document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>"); + var script = document.getElementById("__ie_onload"); + script.onreadystatechange = function() { + if (this.readyState == "complete") { + sorttable.init(); // call the onload handler + } + }; +/*@end @*/ + +/* for Safari */ +if (/WebKit/i.test(navigator.userAgent)) { // sniff + var _timer = setInterval(function() { + if (/loaded|complete/.test(document.readyState)) { + sorttable.init(); // call the onload handler + } + }, 10); +} + +/* for other browsers */ +window.onload = sorttable.init; + +// written by Dean Edwards, 2005 +// with input from Tino Zijdel, Matthias Miller, Diego Perini + +// http://dean.edwards.name/weblog/2005/10/add-event/ + +function dean_addEvent(element, type, handler) { + if (element.addEventListener) { + element.addEventListener(type, handler, false); + } else { + // assign each event handler a unique ID + if (!handler.$$guid) handler.$$guid = dean_addEvent.guid++; + // create a hash table of event types for the element + if (!element.events) element.events = {}; + // create a hash table of event handlers for each element/event pair + var handlers = element.events[type]; + if (!handlers) { + handlers = element.events[type] = {}; + // store the existing event handler (if there is one) + if (element["on" + type]) { + handlers[0] = element["on" + type]; + } + } + // store the event handler in the hash table + handlers[handler.$$guid] = handler; + // assign a global event handler to do all the work + element["on" + type] = handleEvent; + } +}; +// a counter used to create unique IDs +dean_addEvent.guid = 1; + +function removeEvent(element, type, handler) { + if (element.removeEventListener) { + element.removeEventListener(type, handler, false); + } else { + // delete the event handler from the hash table + if (element.events && element.events[type]) { + delete element.events[type][handler.$$guid]; + } + } +}; + +function handleEvent(event) { + var returnValue = true; + // grab the event object (IE uses a global event object) + event = event || fixEvent(((this.ownerDocument || this.document || this).parentWindow || window).event); + // get a reference to the hash table of event handlers + var handlers = this.events[event.type]; + // execute each event handler + for (var i in handlers) { + this.$$handleEvent = handlers[i]; + if (this.$$handleEvent(event) === false) { + returnValue = false; + } + } + return returnValue; +}; + +function fixEvent(event) { + // add W3C standard event methods + event.preventDefault = fixEvent.preventDefault; + event.stopPropagation = fixEvent.stopPropagation; + return event; +}; +fixEvent.preventDefault = function() { + this.returnValue = false; +}; +fixEvent.stopPropagation = function() { + this.cancelBubble = true; +} + +// Dean's forEach: http://dean.edwards.name/base/forEach.js +/* + forEach, version 1.0 + Copyright 2006, Dean Edwards + License: http://www.opensource.org/licenses/mit-license.php +*/ + +// array-like enumeration +if (!Array.forEach) { // mozilla already supports this + Array.forEach = function(array, block, context) { + for (var i = 0; i < array.length; i++) { + block.call(context, array[i], i, array); + } + }; +} + +// generic enumeration +Function.prototype.forEach = function(object, block, context) { + for (var key in object) { + if (typeof this.prototype[key] == "undefined") { + block.call(context, object[key], key, object); + } + } +}; + +// character enumeration +String.forEach = function(string, block, context) { + Array.forEach(string.split(""), function(chr, index) { + block.call(context, chr, index, string); + }); +}; + +// globally resolve forEach enumeration +var forEach = function(object, block, context) { + if (object) { + var resolve = Object; // default + if (object instanceof Function) { + // functions have a "length" property + resolve = Function; + } else if (object.forEach instanceof Function) { + // the object implements a custom forEach method so use that + object.forEach(block, context); + return; + } else if (typeof object == "string") { + // the object is a string + resolve = String; + } else if (typeof object.length == "number") { + // the object is array-like + resolve = Array; + } + resolve.forEach(object, block, context); + } +}; |