From e708db25a55f2584e5f13381235bbcd64256f5f0 Mon Sep 17 00:00:00 2001 From: chad-earthscope Date: Mon, 12 Feb 2024 14:43:15 -0800 Subject: [PATCH] committing documentation --- .nojekyll | 0 annotated.html | 110 + bc_s.png | Bin 0 -> 690 bytes bc_sd.png | Bin 0 -> 583 bytes classes.html | 95 + clipboard.js | 61 + closed.png | Bin 0 -> 132 bytes cookie.js | 58 + customdoxygen.css | 20 + deprecated.html | 91 + doc.svg | 12 + docd.svg | 12 + doxygen.css | 2207 +++++++++++++++++++++ doxygen.svg | 28 + doxygen_crawl.html | 107 + dynsections.js | 194 ++ files.html | 91 + folderclosed.svg | 11 + folderclosedd.svg | 11 + folderopen.svg | 17 + folderopend.svg | 12 + functions.html | 264 +++ functions_eval.html | 89 + functions_vars.html | 260 +++ globals.html | 298 +++ globals_defs.html | 187 ++ globals_enum.html | 87 + globals_func.html | 190 ++ globals_type.html | 88 + globals_vars.html | 88 + group__byte-swap-flags.html | 106 + group__control-flags.html | 138 ++ group__data-selections.html | 581 ++++++ group__encoding-values.html | 150 ++ group__extra-headers.html | 1149 +++++++++++ group__io-functions.html | 1028 ++++++++++ group__leapsecond.html | 269 +++ group__logging.html | 660 ++++++ group__low-level.html | 112 ++ group__memory-allocators.html | 217 ++ group__miniseed-record.html | 1261 ++++++++++++ group__record-list.html | 232 +++ group__return-values.html | 134 ++ group__string-functions.html | 507 +++++ group__time-related.html | 795 ++++++++ group__trace-list.html | 1247 ++++++++++++ group__utility-functions.html | 515 +++++ index.html | 121 ++ jquery.js | 34 + libmseed_8h.html | 86 + libmseed_8h_source.html | 1218 ++++++++++++ menu.js | 134 ++ menudata.js | 95 + minus.svg | 8 + minusd.svg | 8 + nav_f.png | Bin 0 -> 163 bytes nav_fd.png | Bin 0 -> 150 bytes nav_g.png | Bin 0 -> 95 bytes nav_h.png | Bin 0 -> 99 bytes nav_hd.png | Bin 0 -> 102 bytes open.png | Bin 0 -> 121 bytes page-capabilities.html | 127 ++ page-examples.html | 1664 ++++++++++++++++ page-faq.html | 151 ++ page-tutorial.html | 254 +++ pages.html | 88 + plus.svg | 9 + plusd.svg | 9 + porting-guide.html | 208 ++ sample-types.html | 94 + search/all_0.js | 5 + search/all_1.js | 4 + search/all_10.js | 4 + search/all_11.js | 37 + search/all_12.js | 32 + search/all_13.js | 32 + search/all_14.js | 12 + search/all_15.js | 8 + search/all_16.js | 21 + search/all_17.js | 4 + search/all_2.js | 21 + search/all_3.js | 11 + search/all_4.js | 27 + search/all_5.js | 49 + search/all_6.js | 15 + search/all_7.js | 34 + search/all_8.js | 7 + search/all_9.js | 13 + search/all_a.js | 27 + search/all_b.js | 50 + search/all_c.js | 198 ++ search/all_d.js | 17 + search/all_e.js | 10 + search/all_f.js | 14 + search/classes_0.js | 6 + search/classes_1.js | 20 + search/close.svg | 18 + search/defines_0.js | 4 + search/defines_1.js | 5 + search/defines_2.js | 6 + search/defines_3.js | 12 + search/defines_4.js | 4 + search/enums_0.js | 5 + search/enumvalues_0.js | 7 + search/files_0.js | 4 + search/functions_0.js | 8 + search/functions_1.js | 97 + search/groups_0.js | 6 + search/groups_1.js | 4 + search/groups_2.js | 6 + search/groups_3.js | 7 + search/groups_4.js | 5 + search/groups_5.js | 7 + search/groups_6.js | 4 + search/groups_7.js | 5 + search/groups_8.js | 5 + search/groups_9.js | 8 + search/groups_a.js | 4 + search/groups_b.js | 4 + search/groups_c.js | 6 + search/groups_d.js | 7 + search/groups_e.js | 5 + search/groups_f.js | 5 + search/mag.svg | 24 + search/mag_d.svg | 24 + search/mag_sel.svg | 31 + search/mag_seld.svg | 31 + search/pages_0.js | 4 + search/pages_1.js | 4 + search/pages_2.js | 5 + search/pages_3.js | 5 + search/pages_4.js | 6 + search/pages_5.js | 4 + search/pages_6.js | 6 + search/pages_7.js | 4 + search/pages_8.js | 4 + search/pages_9.js | 4 + search/pages_a.js | 5 + search/pages_b.js | 4 + search/search.css | 291 +++ search/search.js | 694 +++++++ search/searchdata.js | 45 + search/typedefs_0.js | 4 + search/typedefs_1.js | 4 + search/typedefs_2.js | 4 + search/variables_0.js | 6 + search/variables_1.js | 6 + search/variables_10.js | 5 + search/variables_11.js | 4 + search/variables_12.js | 4 + search/variables_2.js | 8 + search/variables_3.js | 10 + search/variables_4.js | 10 + search/variables_5.js | 12 + search/variables_6.js | 6 + search/variables_7.js | 6 + search/variables_8.js | 12 + search/variables_9.js | 9 + search/variables_a.js | 8 + search/variables_b.js | 4 + search/variables_c.js | 8 + search/variables_d.js | 16 + search/variables_e.js | 18 + search/variables_f.js | 9 + splitbar.png | Bin 0 -> 316 bytes splitbard.png | Bin 0 -> 277 bytes struct_l_i_b_m_s_e_e_d___m_e_m_o_r_y.html | 108 + struct_l_m_i_o.html | 150 ++ struct_m_s3_tolerance.html | 122 ++ struct_m_s_log_param.html | 120 ++ sync_off.png | Bin 0 -> 861 bytes sync_on.png | Bin 0 -> 854 bytes tab_a.png | Bin 0 -> 137 bytes tab_ad.png | Bin 0 -> 127 bytes tab_b.png | Bin 0 -> 178 bytes tab_bd.png | Bin 0 -> 151 bytes tab_h.png | Bin 0 -> 186 bytes tab_hd.png | Bin 0 -> 169 bytes tab_s.png | Bin 0 -> 198 bytes tab_sd.png | Bin 0 -> 173 bytes tabs.css | 1 + 181 files changed, 20902 insertions(+) create mode 100644 .nojekyll create mode 100644 annotated.html create mode 100644 bc_s.png create mode 100644 bc_sd.png create mode 100644 classes.html create mode 100644 clipboard.js create mode 100644 closed.png create mode 100644 cookie.js create mode 100644 customdoxygen.css create mode 100644 deprecated.html create mode 100644 doc.svg create mode 100644 docd.svg create mode 100644 doxygen.css create mode 100644 doxygen.svg create mode 100644 doxygen_crawl.html create mode 100644 dynsections.js create mode 100644 files.html create mode 100644 folderclosed.svg create mode 100644 folderclosedd.svg create mode 100644 folderopen.svg create mode 100644 folderopend.svg create mode 100644 functions.html create mode 100644 functions_eval.html create mode 100644 functions_vars.html create mode 100644 globals.html create mode 100644 globals_defs.html create mode 100644 globals_enum.html create mode 100644 globals_func.html create mode 100644 globals_type.html create mode 100644 globals_vars.html create mode 100644 group__byte-swap-flags.html create mode 100644 group__control-flags.html create mode 100644 group__data-selections.html create mode 100644 group__encoding-values.html create mode 100644 group__extra-headers.html create mode 100644 group__io-functions.html create mode 100644 group__leapsecond.html create mode 100644 group__logging.html create mode 100644 group__low-level.html create mode 100644 group__memory-allocators.html create mode 100644 group__miniseed-record.html create mode 100644 group__record-list.html create mode 100644 group__return-values.html create mode 100644 group__string-functions.html create mode 100644 group__time-related.html create mode 100644 group__trace-list.html create mode 100644 group__utility-functions.html create mode 100644 index.html create mode 100644 jquery.js create mode 100644 libmseed_8h.html create mode 100644 libmseed_8h_source.html create mode 100644 menu.js create mode 100644 menudata.js create mode 100644 minus.svg create mode 100644 minusd.svg create mode 100644 nav_f.png create mode 100644 nav_fd.png create mode 100644 nav_g.png create mode 100644 nav_h.png create mode 100644 nav_hd.png create mode 100644 open.png create mode 100644 page-capabilities.html create mode 100644 page-examples.html create mode 100644 page-faq.html create mode 100644 page-tutorial.html create mode 100644 pages.html create mode 100644 plus.svg create mode 100644 plusd.svg create mode 100644 porting-guide.html create mode 100644 sample-types.html create mode 100644 search/all_0.js create mode 100644 search/all_1.js create mode 100644 search/all_10.js create mode 100644 search/all_11.js create mode 100644 search/all_12.js create mode 100644 search/all_13.js create mode 100644 search/all_14.js create mode 100644 search/all_15.js create mode 100644 search/all_16.js create mode 100644 search/all_17.js create mode 100644 search/all_2.js create mode 100644 search/all_3.js create mode 100644 search/all_4.js create mode 100644 search/all_5.js create mode 100644 search/all_6.js create mode 100644 search/all_7.js create mode 100644 search/all_8.js create mode 100644 search/all_9.js create mode 100644 search/all_a.js create mode 100644 search/all_b.js create mode 100644 search/all_c.js create mode 100644 search/all_d.js create mode 100644 search/all_e.js create mode 100644 search/all_f.js create mode 100644 search/classes_0.js create mode 100644 search/classes_1.js create mode 100644 search/close.svg create mode 100644 search/defines_0.js create mode 100644 search/defines_1.js create mode 100644 search/defines_2.js create mode 100644 search/defines_3.js create mode 100644 search/defines_4.js create mode 100644 search/enums_0.js create mode 100644 search/enumvalues_0.js create mode 100644 search/files_0.js create mode 100644 search/functions_0.js create mode 100644 search/functions_1.js create mode 100644 search/groups_0.js create mode 100644 search/groups_1.js create mode 100644 search/groups_2.js create mode 100644 search/groups_3.js create mode 100644 search/groups_4.js create mode 100644 search/groups_5.js create mode 100644 search/groups_6.js create mode 100644 search/groups_7.js create mode 100644 search/groups_8.js create mode 100644 search/groups_9.js create mode 100644 search/groups_a.js create mode 100644 search/groups_b.js create mode 100644 search/groups_c.js create mode 100644 search/groups_d.js create mode 100644 search/groups_e.js create mode 100644 search/groups_f.js create mode 100644 search/mag.svg create mode 100644 search/mag_d.svg create mode 100644 search/mag_sel.svg create mode 100644 search/mag_seld.svg create mode 100644 search/pages_0.js create mode 100644 search/pages_1.js create mode 100644 search/pages_2.js create mode 100644 search/pages_3.js create mode 100644 search/pages_4.js create mode 100644 search/pages_5.js create mode 100644 search/pages_6.js create mode 100644 search/pages_7.js create mode 100644 search/pages_8.js create mode 100644 search/pages_9.js create mode 100644 search/pages_a.js create mode 100644 search/pages_b.js create mode 100644 search/search.css create mode 100644 search/search.js create mode 100644 search/searchdata.js create mode 100644 search/typedefs_0.js create mode 100644 search/typedefs_1.js create mode 100644 search/typedefs_2.js create mode 100644 search/variables_0.js create mode 100644 search/variables_1.js create mode 100644 search/variables_10.js create mode 100644 search/variables_11.js create mode 100644 search/variables_12.js create mode 100644 search/variables_2.js create mode 100644 search/variables_3.js create mode 100644 search/variables_4.js create mode 100644 search/variables_5.js create mode 100644 search/variables_6.js create mode 100644 search/variables_7.js create mode 100644 search/variables_8.js create mode 100644 search/variables_9.js create mode 100644 search/variables_a.js create mode 100644 search/variables_b.js create mode 100644 search/variables_c.js create mode 100644 search/variables_d.js create mode 100644 search/variables_e.js create mode 100644 search/variables_f.js create mode 100644 splitbar.png create mode 100644 splitbard.png create mode 100644 struct_l_i_b_m_s_e_e_d___m_e_m_o_r_y.html create mode 100644 struct_l_m_i_o.html create mode 100644 struct_m_s3_tolerance.html create mode 100644 struct_m_s_log_param.html create mode 100644 sync_off.png create mode 100644 sync_on.png create mode 100644 tab_a.png create mode 100644 tab_ad.png create mode 100644 tab_b.png create mode 100644 tab_bd.png create mode 100644 tab_h.png create mode 100644 tab_hd.png create mode 100644 tab_s.png create mode 100644 tab_sd.png create mode 100644 tabs.css diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/annotated.html b/annotated.html new file mode 100644 index 0000000..9cca81a --- /dev/null +++ b/annotated.html @@ -0,0 +1,110 @@ + + + + + + + +libmseed: Data Structures + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Data Structures
+
+
+
Here are the data structures with brief descriptions:
+ + + + + + + + + + + + + + + + + + + + + +
 CLeapSecondLeap second list container
 CLIBMSEED_MEMORY
 CLMIOType definition for data source I/O: file-system versus URL
 CMS3FileParamState container for reading miniSEED records from files or URLs
 CMS3RecordMiniSEED record container
 CMS3RecordListRecord list, holds MS3RecordPtr entries that contribute to a given MS3TraceSeg
 CMS3RecordPtrA miniSEED record pointer and metadata
 CMS3SelectionsData selection structure definition containers
 CMS3SelectTimeData selection structure time window definition containers
 CMS3ToleranceCallback functions that return time and sample rate tolerances
 CMS3TraceIDContainer for a trace ID, linkable
 CMS3TraceListContainer for a collection of continuous trace segment, linkable
 CMS3TraceSegContainer for a continuous trace segment, linkable
 CMSEHCalibrationContainer for calibration parameters for use in extra headers
 CMSEHEventDetectionContainer for event detection parameters for use in extra headers
 CMSEHRecenterContainer for recenter parameters for use in extra headers
 CMSEHTimingExceptionContainer for timing exception parameters for use in extra headers
 CMSLogEntryLog registry entry
 CMSLogParamLogging parameters. Callers should not modify these values directly and generally should not need to access them.
 CMSLogRegistryLog message registry
+
+
+ + + + + diff --git a/bc_s.png b/bc_s.png new file mode 100644 index 0000000000000000000000000000000000000000..205568edec38bab37564f0788e5f49620e52dcaf GIT binary patch literal 690 zcmV;j0!{siP)e<=1-0eJR3 z6{~+u1)EFL7Y)6S%}PL1$D_<&_Bw2=JzGcJdpi=j zDFNGd^=1NYHO=_SOAX)OjfU<21H>39cjjeN6h1mK7Jh-Yw)+4;p@TVk{gL9r>@TC^ z{C3pf?FImaXaeErN=E@99NC2$+U^4YEX^w%$GMFL`W33%c^3d+X|`mk^(U;BWnpYB z^8f%W&9kh@Xb}c|jcQx(0DwX{fC%1hvr0RHw(PhC01BOCw9C6VRu`I@3bmol9_hj| zV=S+rL`$iN1Jj>FFOj?XMrLz^DvNn&HW$qE(;xrbMoeX;S46H_`D*S z2&5Fi+S>D{G+L8a7;qw)2zCL0La3_dTu5)Us|kYire=Zz0HBaCv}#@$E|p3I{%MNw Y8xMG=uC*Ggx&QzG07*qoM6N<$f{aZ;g8%>k literal 0 HcmV?d00001 diff --git a/bc_sd.png b/bc_sd.png new file mode 100644 index 0000000000000000000000000000000000000000..2d99c49b1415f14511def27619707cfeabe5b97b GIT binary patch literal 583 zcmV-N0=WH&P)`ROs|EyPU@tY=`#%bJG1uU%sI2q*$;s9$PCb;_Swdc;?cPyulAROGy%-DRRHg|8Gz;aw4NTsW1$X;pc`c8HBu1YPv0iJj}S~&Zq zGIQs~u?c3nB6-N&nb+&+8*hy9_=WX&Yusu zVa<^L^F|G8F#re><;n}H68A)+y{U!%!qEa<<@^XtqQbAGRSIX zbnas|f9j>o5!MVJ{IcofPJX9ek~z)zFz0#2yIi5=c?gB|0W>ywirZw(^Pq-w51XZR z*~wjM$Md16n#UTOr;*CkwuU@}aB$GCO$}))tY6>n{&)`HD1@R)mUwAxcGuVc`2c>T zf~~fdw2IqgRp!HRP#i64_7bUy9<@!RH$ZN(&gI`5=J*C6a18F#iYIcr%+3Kokbl5) VX#|0TA6WnZ002ovPDHLkV1jN+6bAqR literal 0 HcmV?d00001 diff --git a/classes.html b/classes.html new file mode 100644 index 0000000..947a908 --- /dev/null +++ b/classes.html @@ -0,0 +1,95 @@ + + + + + + + +libmseed: Data Structure Index + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Data Structure Index
+
+ + + + + + diff --git a/clipboard.js b/clipboard.js new file mode 100644 index 0000000..42c1fb0 --- /dev/null +++ b/clipboard.js @@ -0,0 +1,61 @@ +/** + +The code below is based on the Doxygen Awesome project, see +https://github.com/jothepro/doxygen-awesome-css + +MIT License + +Copyright (c) 2021 - 2022 jothepro + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +*/ + +let clipboard_title = "Copy to clipboard" +let clipboard_icon = `` +let clipboard_successIcon = `` +let clipboard_successDuration = 1000 + +$(function() { + if(navigator.clipboard) { + const fragments = document.getElementsByClassName("fragment") + for(const fragment of fragments) { + const clipboard_div = document.createElement("div") + clipboard_div.classList.add("clipboard") + clipboard_div.innerHTML = clipboard_icon + clipboard_div.title = clipboard_title + $(clipboard_div).click(function() { + const content = this.parentNode.cloneNode(true) + // filter out line number and folded fragments from file listings + content.querySelectorAll(".lineno, .ttc, .foldclosed").forEach((node) => { node.remove() }) + let text = content.textContent + // remove trailing newlines and trailing spaces from empty lines + text = text.replace(/^\s*\n/gm,'\n').replace(/\n*$/,'') + navigator.clipboard.writeText(text); + this.classList.add("success") + this.innerHTML = clipboard_successIcon + window.setTimeout(() => { // switch back to normal icon after timeout + this.classList.remove("success") + this.innerHTML = clipboard_icon + }, clipboard_successDuration); + }) + fragment.insertBefore(clipboard_div, fragment.firstChild) + } + } +}) diff --git a/closed.png b/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..2358dcee891bf70e1ebd78ceb20caeb1c66c3d7e GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V-kvUwAr*{o@1EvmP~>pExcckP zjSVaFxC)Z%rF?xFG(r+8wE5=?F@&7D&bB~{`9{PHhESm|```V4t#bRpB4+0;VY@W; gylhaPl(3ic(R2|3k=O}~fW|U-y85}Sb4q9e0I!%VCIA2c literal 0 HcmV?d00001 diff --git a/cookie.js b/cookie.js new file mode 100644 index 0000000..53ad21d --- /dev/null +++ b/cookie.js @@ -0,0 +1,58 @@ +/*! + Cookie helper functions + Copyright (c) 2023 Dimitri van Heesch + Released under MIT license. +*/ +let Cookie = { + cookie_namespace: 'doxygen_', + + readSetting(cookie,defVal) { + if (window.chrome) { + const val = localStorage.getItem(this.cookie_namespace+cookie) || + sessionStorage.getItem(this.cookie_namespace+cookie); + if (val) return val; + } else { + let myCookie = this.cookie_namespace+cookie+"="; + if (document.cookie) { + const index = document.cookie.indexOf(myCookie); + if (index != -1) { + const valStart = index + myCookie.length; + let valEnd = document.cookie.indexOf(";", valStart); + if (valEnd == -1) { + valEnd = document.cookie.length; + } + return document.cookie.substring(valStart, valEnd); + } + } + } + return defVal; + }, + + writeSetting(cookie,val,days=10*365) { // default days='forever', 0=session cookie, -1=delete + if (window.chrome) { + if (days==0) { + sessionStorage.setItem(this.cookie_namespace+cookie,val); + } else { + localStorage.setItem(this.cookie_namespace+cookie,val); + } + } else { + let date = new Date(); + date.setTime(date.getTime()+(days*24*60*60*1000)); + const expiration = days!=0 ? "expires="+date.toGMTString()+";" : ""; + document.cookie = this.cookie_namespace + cookie + "=" + + val + "; SameSite=Lax;" + expiration + "path=/"; + } + }, + + eraseSetting(cookie) { + if (window.chrome) { + if (localStorage.getItem(this.cookie_namespace+cookie)) { + localStorage.removeItem(this.cookie_namespace+cookie); + } else if (sessionStorage.getItem(this.cookie_namespace+cookie)) { + sessionStorage.removeItem(this.cookie_namespace+cookie); + } + } else { + this.writeSetting(cookie,'',-1); + } + }, +} diff --git a/customdoxygen.css b/customdoxygen.css new file mode 100644 index 0000000..941a654 --- /dev/null +++ b/customdoxygen.css @@ -0,0 +1,20 @@ +.memtitle { + padding-left: 0px; +} + +/* Replace content of permalinks */ +.permalink a { + color: transparent; + font-size: 0; +} + +.permalink a:before { + content: url('https://cdnjs.cloudflare.com/ajax/libs/octicons/8.5.0/svg/link.svg'); + visibility: hidden; + padding-right: 2px; +} + +/* Show link icon when member title is hovered */ +h2.memtitle:hover .permalink a:before { + visibility: visible; +} diff --git a/deprecated.html b/deprecated.html new file mode 100644 index 0000000..1c4d251 --- /dev/null +++ b/deprecated.html @@ -0,0 +1,91 @@ + + + + + + + +libmseed: Deprecated List + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
Deprecated List
+
+
+
+
Global ms_nstime2timestrz (nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subsecond)
+
This function should be replaced with desired use of timeformat values with the '_Z' designator.
+
+
+
+ + + + + diff --git a/doc.svg b/doc.svg new file mode 100644 index 0000000..608b51a --- /dev/null +++ b/doc.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/docd.svg b/docd.svg new file mode 100644 index 0000000..f024ad5 --- /dev/null +++ b/docd.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/doxygen.css b/doxygen.css new file mode 100644 index 0000000..110a830 --- /dev/null +++ b/doxygen.css @@ -0,0 +1,2207 @@ +/* The standard CSS for doxygen 1.10.0*/ + +html { +/* page base colors */ +--page-background-color: white; +--page-foreground-color: black; +--page-link-color: #262E58; +--page-visited-link-color: #2F3A6D; + +/* index */ +--index-odd-item-bg-color: #F5F5FA; +--index-even-item-bg-color: white; +--index-header-color: black; +--index-separator-color: #A0A0A0; + +/* header */ +--header-background-color: #F6F7FB; +--header-separator-color: #ABB3DA; +--header-gradient-image: url('nav_h.png'); +--group-header-separator-color: #5C6BB7; +--group-header-color: #1F2648; +--inherit-header-color: gray; + +--footer-foreground-color: #161B33; +--footer-logo-width: 104px; +--citation-label-color: #1D2343; +--glow-color: cyan; + +--title-background-color: white; +--title-separator-color: #394684; +--directory-separator-color: #7683C3; +--separator-color: #333E76; + +--blockquote-background-color: #F3F4F9; +--blockquote-border-color: #7683C3; + +--scrollbar-thumb-color: #7683C3; +--scrollbar-background-color: #F6F7FB; + +--icon-background-color: #4858A6; +--icon-foreground-color: white; +--icon-doc-image: url('doc.svg'); +--icon-folder-open-image: url('folderopen.svg'); +--icon-folder-closed-image: url('folderclosed.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #F6F7FB; +--memdecl-separator-color: #CFD3EA; +--memdecl-foreground-color: #555; +--memdecl-template-color: #2F3A6D; + +/* detailed member list */ +--memdef-border-color: #8591CA; +--memdef-title-background-color: #D5D9EC; +--memdef-title-gradient-image: url('nav_f.png'); +--memdef-proto-background-color: #D0D5EA; +--memdef-proto-text-color: #121629; +--memdef-proto-text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--memdef-doc-background-color: white; +--memdef-param-name-color: #602020; +--memdef-template-color: #2F3A6D; + +/* tables */ +--table-cell-border-color: #181D38; +--table-header-background-color: #21284C; +--table-header-foreground-color: #FFFFFF; + +/* labels */ +--label-background-color: #4858A6; +--label-left-top-border-color: #394684; +--label-right-bottom-border-color: #ABB3DA; +--label-foreground-color: white; + +/** navigation bar/tree/menu */ +--nav-background-color: #F6F7FB; +--nav-foreground-color: #202749; +--nav-gradient-image: url('tab_b.png'); +--nav-gradient-hover-image: url('tab_h.png'); +--nav-gradient-active-image: url('tab_a.png'); +--nav-gradient-active-image-parent: url("../tab_a.png"); +--nav-separator-image: url('tab_s.png'); +--nav-breadcrumb-image: url('bc_s.png'); +--nav-breadcrumb-border-color: #A8B0D9; +--nav-splitbar-image: url('splitbar.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #14192F; +--nav-text-hover-color: white; +--nav-text-active-color: white; +--nav-text-normal-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9); +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #202749; +--nav-menu-background-color: white; +--nav-menu-foreground-color: #555555; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.5); +--nav-arrow-color: #7683C3; +--nav-arrow-selected-color: #7683C3; + +/* table of contents */ +--toc-background-color: #F0F1F8; +--toc-border-color: #C6CCE6; +--toc-header-color: #2F3A6D; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: white; +--search-foreground-color: #909090; +--search-magnification-image: url('mag.svg'); +--search-magnification-select-image: url('mag_sel.svg'); +--search-active-color: black; +--search-filter-background-color: #F6F7FB; +--search-filter-foreground-color: black; +--search-filter-border-color: #6675BC; +--search-filter-highlight-text-color: white; +--search-filter-highlight-bg-color: #262E58; +--search-results-foreground-color: #2B3463; +--search-results-background-color: #E6E8F4; +--search-results-border-color: black; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #555; + +/** code fragments */ +--code-keyword-color: #008000; +--code-type-keyword-color: #604020; +--code-flow-keyword-color: #E08000; +--code-comment-color: #800000; +--code-preprocessor-color: #806020; +--code-string-literal-color: #002080; +--code-char-literal-color: #008080; +--code-xml-cdata-color: black; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #000000; +--code-vhdl-keyword-color: #700070; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #2F3A6D; +--code-external-link-color: #2F3A6D; +--fragment-foreground-color: black; +--fragment-background-color: #F9FAFC; +--fragment-border-color: #ABB3DA; +--fragment-lineno-border-color: #00FF00; +--fragment-lineno-background-color: #E8E8E8; +--fragment-lineno-foreground-color: black; +--fragment-lineno-link-fg-color: #2F3A6D; +--fragment-lineno-link-bg-color: #D8D8D8; +--fragment-lineno-link-hover-fg-color: #2F3A6D; +--fragment-lineno-link-hover-bg-color: #C8C8C8; +--fragment-copy-ok-color: #2EC82E; +--tooltip-foreground-color: black; +--tooltip-background-color: white; +--tooltip-border-color: gray; +--tooltip-doc-color: grey; +--tooltip-declaration-color: #006318; +--tooltip-link-color: #2F3A6D; +--tooltip-shadow: 1px 1px 7px gray; +--fold-line-color: #808080; +--fold-minus-image: url('minus.svg'); +--fold-plus-image: url('plus.svg'); +--fold-minus-image-relpath: url('../../minus.svg'); +--fold-plus-image-relpath: url('../../plus.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #f8d1cc; +--warning-color-hl: #b61825; +--warning-color-text: #75070f; +--note-color-bg: #faf3d8; +--note-color-hl: #f3a600; +--note-color-text: #5f4204; +--todo-color-bg: #e4f3ff; +--todo-color-hl: #1879C4; +--todo-color-text: #274a5c; +--test-color-bg: #e8e8ff; +--test-color-hl: #3939C4; +--test-color-text: #1a1a5c; +--deprecated-color-bg: #ecf0f3; +--deprecated-color-hl: #5b6269; +--deprecated-color-text: #43454a; +--bug-color-bg: #e4dafd; +--bug-color-hl: #5b2bdd; +--bug-color-text: #2a0d72; +--invariant-color-bg: #d8f1e3; +--invariant-color-hl: #44b86f; +--invariant-color-text: #265532; +} + +@media (prefers-color-scheme: dark) { + html:not(.dark-mode) { + color-scheme: dark; + +/* page base colors */ +--page-background-color: black; +--page-foreground-color: #C9D1D9; +--page-link-color: #6675BC; +--page-visited-link-color: #7F8BC7; + +/* index */ +--index-odd-item-bg-color: #030307; +--index-even-item-bg-color: black; +--index-header-color: #ABB3DA; +--index-separator-color: #1D2343; + +/* header */ +--header-background-color: #010203; +--header-separator-color: #070810; +--header-gradient-image: url('nav_hd.png'); +--group-header-separator-color: #14192F; +--group-header-color: #6675BC; +--inherit-header-color: #A0A0A0; + +--footer-foreground-color: #3D4A8C; +--footer-logo-width: 60px; +--citation-label-color: #6675BC; +--glow-color: cyan; + +--title-background-color: #020205; +--title-separator-color: #1F2547; +--directory-separator-color: #14192F; +--separator-color: #14192F; + +--blockquote-background-color: #05060C; +--blockquote-border-color: #14192F; + +--scrollbar-thumb-color: #14192F; +--scrollbar-background-color: #010203; + +--icon-background-color: #1D2343; +--icon-foreground-color: #ABB3DA; +--icon-doc-image: url('docd.svg'); +--icon-folder-open-image: url('folderopend.svg'); +--icon-folder-closed-image: url('folderclosedd.svg'); + +/* brief member declaration list */ +--memdecl-background-color: #030307; +--memdecl-separator-color: #171C35; +--memdecl-foreground-color: #BBB; +--memdecl-template-color: #4E5FB2; + +/* detailed member list */ +--memdef-border-color: #101426; +--memdef-title-background-color: #0B0E1B; +--memdef-title-gradient-image: url('nav_fd.png'); +--memdef-proto-background-color: #0A0C17; +--memdef-proto-text-color: #7784C3; +--memdef-proto-text-shadow: 0px 1px 1px rgba(0, 0, 0, 0.9); +--memdef-doc-background-color: black; +--memdef-param-name-color: #D28757; +--memdef-template-color: #4E5FB2; + +/* tables */ +--table-cell-border-color: #14192F; +--table-header-background-color: #14192F; +--table-header-foreground-color: #ABB3DA; + +/* labels */ +--label-background-color: #1F2648; +--label-left-top-border-color: #2F3A6D; +--label-right-bottom-border-color: #14192F; +--label-foreground-color: #CCCCCC; + +/** navigation bar/tree/menu */ +--nav-background-color: #05060C; +--nav-foreground-color: #202749; +--nav-gradient-image: url('tab_bd.png'); +--nav-gradient-hover-image: url('tab_hd.png'); +--nav-gradient-active-image: url('tab_ad.png'); +--nav-gradient-active-image-parent: url("../tab_ad.png"); +--nav-separator-image: url('tab_sd.png'); +--nav-breadcrumb-image: url('bc_sd.png'); +--nav-breadcrumb-border-color: #161B33; +--nav-splitbar-image: url('splitbard.png'); +--nav-font-size-level1: 13px; +--nav-font-size-level2: 10px; +--nav-font-size-level3: 9px; +--nav-text-normal-color: #98A2D2; +--nav-text-hover-color: #CBD0E8; +--nav-text-active-color: #CBD0E8; +--nav-text-normal-shadow: 0px 1px 1px black; +--nav-text-hover-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-text-active-shadow: 0px 1px 1px rgba(0, 0, 0, 1.0); +--nav-menu-button-color: #98A2D2; +--nav-menu-background-color: #010102; +--nav-menu-foreground-color: #BBBBBB; +--nav-menu-toggle-color: rgba(255, 255, 255, 0.2); +--nav-arrow-color: #1D2343; +--nav-arrow-selected-color: #6675BC; + +/* table of contents */ +--toc-background-color: #070911; +--toc-border-color: #0E1121; +--toc-header-color: #7F8BC7; +--toc-down-arrow-image: url("data:image/svg+xml;utf8,&%238595;"); + +/** search field */ +--search-background-color: black; +--search-foreground-color: #C5C5C5; +--search-magnification-image: url('mag_d.svg'); +--search-magnification-select-image: url('mag_seld.svg'); +--search-active-color: #C5C5C5; +--search-filter-background-color: #05060C; +--search-filter-foreground-color: #6675BC; +--search-filter-border-color: #4E5FB2; +--search-filter-highlight-text-color: #A0A9D5; +--search-filter-highlight-bg-color: #14192F; +--search-results-background-color: #05060C; +--search-results-foreground-color: #6675BC; +--search-results-border-color: #4E5FB2; +--search-box-shadow: inset 0.5px 0.5px 3px 0px #1A1F3C; + +/** code fragments */ +--code-keyword-color: #CC99CD; +--code-type-keyword-color: #AB99CD; +--code-flow-keyword-color: #E08000; +--code-comment-color: #717790; +--code-preprocessor-color: #65CABE; +--code-string-literal-color: #7EC699; +--code-char-literal-color: #00E0F0; +--code-xml-cdata-color: #C9D1D9; +--code-vhdl-digit-color: #FF00FF; +--code-vhdl-char-color: #C0C0C0; +--code-vhdl-keyword-color: #CF53C9; +--code-vhdl-logic-color: #FF0000; +--code-link-color: #79C0FF; +--code-external-link-color: #79C0FF; +--fragment-foreground-color: #C9D1D9; +--fragment-background-color: #020205; +--fragment-border-color: #30363D; +--fragment-lineno-border-color: #30363D; +--fragment-lineno-background-color: black; +--fragment-lineno-foreground-color: #6E7681; +--fragment-lineno-link-fg-color: #6E7681; +--fragment-lineno-link-bg-color: #303030; +--fragment-lineno-link-hover-fg-color: #8E96A1; +--fragment-lineno-link-hover-bg-color: #505050; +--fragment-copy-ok-color: #0EA80E; +--tooltip-foreground-color: #C9D1D9; +--tooltip-background-color: #202020; +--tooltip-border-color: #C9D1D9; +--tooltip-doc-color: #D9E1E9; +--tooltip-declaration-color: #20C348; +--tooltip-link-color: #79C0FF; +--tooltip-shadow: none; +--fold-line-color: #808080; +--fold-minus-image: url('minusd.svg'); +--fold-plus-image: url('plusd.svg'); +--fold-minus-image-relpath: url('../../minusd.svg'); +--fold-plus-image-relpath: url('../../plusd.svg'); + +/** font-family */ +--font-family-normal: Roboto,sans-serif; +--font-family-monospace: 'JetBrains Mono',Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace,fixed; +--font-family-nav: 'Lucida Grande',Geneva,Helvetica,Arial,sans-serif; +--font-family-title: Tahoma,Arial,sans-serif; +--font-family-toc: Verdana,'DejaVu Sans',Geneva,sans-serif; +--font-family-search: Arial,Verdana,sans-serif; +--font-family-icon: Arial,Helvetica; +--font-family-tooltip: Roboto,sans-serif; + +/** special sections */ +--warning-color-bg: #2e1917; +--warning-color-hl: #ad2617; +--warning-color-text: #f5b1aa; +--note-color-bg: #3b2e04; +--note-color-hl: #f1b602; +--note-color-text: #ceb670; +--todo-color-bg: #163750; +--todo-color-hl: #1982D2; +--todo-color-text: #dcf0fa; +--test-color-bg: #121258; +--test-color-hl: #4242cf; +--test-color-text: #c0c0da; +--deprecated-color-bg: #2e323b; +--deprecated-color-hl: #738396; +--deprecated-color-text: #abb0bd; +--bug-color-bg: #2a2536; +--bug-color-hl: #7661b3; +--bug-color-text: #ae9ed6; +--invariant-color-bg: #303a35; +--invariant-color-hl: #76ce96; +--invariant-color-text: #cceed5; +}} +body { + background-color: var(--page-background-color); + color: var(--page-foreground-color); +} + +body, table, div, p, dl { + font-weight: 400; + font-size: 14px; + font-family: var(--font-family-normal); + line-height: 22px; +} + +/* @group Heading Levels */ + +.title { + font-family: var(--font-family-normal); + line-height: 28px; + font-size: 150%; + font-weight: bold; + margin: 10px 2px; +} + +h1.groupheader { + font-size: 150%; +} + +h2.groupheader { + border-bottom: 1px solid var(--group-header-separator-color); + color: var(--group-header-color); + font-size: 150%; + font-weight: normal; + margin-top: 1.75em; + padding-top: 8px; + padding-bottom: 4px; + width: 100%; +} + +h3.groupheader { + font-size: 100%; +} + +h1, h2, h3, h4, h5, h6 { + -webkit-transition: text-shadow 0.5s linear; + -moz-transition: text-shadow 0.5s linear; + -ms-transition: text-shadow 0.5s linear; + -o-transition: text-shadow 0.5s linear; + transition: text-shadow 0.5s linear; + margin-right: 15px; +} + +h1.glow, h2.glow, h3.glow, h4.glow, h5.glow, h6.glow { + text-shadow: 0 0 15px var(--glow-color); +} + +dt { + font-weight: bold; +} + +p.startli, p.startdd { + margin-top: 2px; +} + +th p.starttd, th p.intertd, th p.endtd { + font-size: 100%; + font-weight: 700; +} + +p.starttd { + margin-top: 0px; +} + +p.endli { + margin-bottom: 0px; +} + +p.enddd { + margin-bottom: 4px; +} + +p.endtd { + margin-bottom: 2px; +} + +p.interli { +} + +p.interdd { +} + +p.intertd { +} + +/* @end */ + +caption { + font-weight: bold; +} + +span.legend { + font-size: 70%; + text-align: center; +} + +h3.version { + font-size: 90%; + text-align: center; +} + +div.navtab { + padding-right: 15px; + text-align: right; + line-height: 110%; +} + +div.navtab table { + border-spacing: 0; +} + +td.navtab { + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL { + background-image: var(--nav-gradient-active-image); + background-repeat:repeat-x; + padding-right: 6px; + padding-left: 6px; +} + +td.navtabHL a, td.navtabHL a:visited { + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +a.navtab { + font-weight: bold; +} + +div.qindex{ + text-align: center; + width: 100%; + line-height: 140%; + font-size: 130%; + color: var(--index-separator-color); +} + +#main-menu a:focus { + outline: auto; + z-index: 10; + position: relative; +} + +dt.alphachar{ + font-size: 180%; + font-weight: bold; +} + +.alphachar a{ + color: var(--index-header-color); +} + +.alphachar a:hover, .alphachar a:visited{ + text-decoration: none; +} + +.classindex dl { + padding: 25px; + column-count:1 +} + +.classindex dd { + display:inline-block; + margin-left: 50px; + width: 90%; + line-height: 1.15em; +} + +.classindex dl.even { + background-color: var(--index-even-item-bg-color); +} + +.classindex dl.odd { + background-color: var(--index-odd-item-bg-color); +} + +@media(min-width: 1120px) { + .classindex dl { + column-count:2 + } +} + +@media(min-width: 1320px) { + .classindex dl { + column-count:3 + } +} + + +/* @group Link Styling */ + +a { + color: var(--page-link-color); + font-weight: normal; + text-decoration: none; +} + +.contents a:visited { + color: var(--page-visited-link-color); +} + +a:hover { + text-decoration: none; + background: linear-gradient(to bottom, transparent 0,transparent calc(100% - 1px), currentColor 100%); +} + +a:hover > span.arrow { + text-decoration: none; + background : var(--nav-background-color); +} + +a.el { + font-weight: bold; +} + +a.elRef { +} + +a.code, a.code:visited, a.line, a.line:visited { + color: var(--code-link-color); +} + +a.codeRef, a.codeRef:visited, a.lineRef, a.lineRef:visited { + color: var(--code-external-link-color); +} + +a.code.hl_class { /* style for links to class names in code snippets */ } +a.code.hl_struct { /* style for links to struct names in code snippets */ } +a.code.hl_union { /* style for links to union names in code snippets */ } +a.code.hl_interface { /* style for links to interface names in code snippets */ } +a.code.hl_protocol { /* style for links to protocol names in code snippets */ } +a.code.hl_category { /* style for links to category names in code snippets */ } +a.code.hl_exception { /* style for links to exception names in code snippets */ } +a.code.hl_service { /* style for links to service names in code snippets */ } +a.code.hl_singleton { /* style for links to singleton names in code snippets */ } +a.code.hl_concept { /* style for links to concept names in code snippets */ } +a.code.hl_namespace { /* style for links to namespace names in code snippets */ } +a.code.hl_package { /* style for links to package names in code snippets */ } +a.code.hl_define { /* style for links to macro names in code snippets */ } +a.code.hl_function { /* style for links to function names in code snippets */ } +a.code.hl_variable { /* style for links to variable names in code snippets */ } +a.code.hl_typedef { /* style for links to typedef names in code snippets */ } +a.code.hl_enumvalue { /* style for links to enum value names in code snippets */ } +a.code.hl_enumeration { /* style for links to enumeration names in code snippets */ } +a.code.hl_signal { /* style for links to Qt signal names in code snippets */ } +a.code.hl_slot { /* style for links to Qt slot names in code snippets */ } +a.code.hl_friend { /* style for links to friend names in code snippets */ } +a.code.hl_dcop { /* style for links to KDE3 DCOP names in code snippets */ } +a.code.hl_property { /* style for links to property names in code snippets */ } +a.code.hl_event { /* style for links to event names in code snippets */ } +a.code.hl_sequence { /* style for links to sequence names in code snippets */ } +a.code.hl_dictionary { /* style for links to dictionary names in code snippets */ } + +/* @end */ + +dl.el { + margin-left: -1cm; +} + +ul { + overflow: visible; +} + +ul.multicol { + -moz-column-gap: 1em; + -webkit-column-gap: 1em; + column-gap: 1em; + -moz-column-count: 3; + -webkit-column-count: 3; + column-count: 3; + list-style-type: none; +} + +#side-nav ul { + overflow: visible; /* reset ul rule for scroll bar in GENERATE_TREEVIEW window */ +} + +#main-nav ul { + overflow: visible; /* reset ul rule for the navigation bar drop down lists */ +} + +.fragment { + text-align: left; + direction: ltr; + overflow-x: auto; + overflow-y: hidden; + position: relative; + min-height: 12px; + margin: 10px 0px; + padding: 10px 10px; + border: 1px solid var(--fragment-border-color); + border-radius: 4px; + background-color: var(--fragment-background-color); + color: var(--fragment-foreground-color); +} + +pre.fragment { + word-wrap: break-word; + font-size: 10pt; + line-height: 125%; + font-family: var(--font-family-monospace); +} + +.clipboard { + width: 24px; + height: 24px; + right: 5px; + top: 5px; + opacity: 0; + position: absolute; + display: inline; + overflow: auto; + fill: var(--fragment-foreground-color); + justify-content: center; + align-items: center; + cursor: pointer; +} + +.clipboard.success { + border: 1px solid var(--fragment-foreground-color); + border-radius: 4px; +} + +.fragment:hover .clipboard, .clipboard.success { + opacity: .28; +} + +.clipboard:hover, .clipboard.success { + opacity: 1 !important; +} + +.clipboard:active:not([class~=success]) svg { + transform: scale(.91); +} + +.clipboard.success svg { + fill: var(--fragment-copy-ok-color); +} + +.clipboard.success { + border-color: var(--fragment-copy-ok-color); +} + +div.line { + font-family: var(--font-family-monospace); + font-size: 13px; + min-height: 13px; + line-height: 1.2; + text-wrap: unrestricted; + white-space: -moz-pre-wrap; /* Moz */ + white-space: -pre-wrap; /* Opera 4-6 */ + white-space: -o-pre-wrap; /* Opera 7 */ + white-space: pre-wrap; /* CSS3 */ + word-wrap: break-word; /* IE 5.5+ */ + text-indent: -53px; + padding-left: 53px; + padding-bottom: 0px; + margin: 0px; + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +div.line:after { + content:"\000A"; + white-space: pre; +} + +div.line.glow { + background-color: var(--glow-color); + box-shadow: 0 0 10px var(--glow-color); +} + +span.fold { + margin-left: 5px; + margin-right: 1px; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; + display: inline-block; + width: 12px; + height: 12px; + background-repeat:no-repeat; + background-position:center; +} + +span.lineno { + padding-right: 4px; + margin-right: 9px; + text-align: right; + border-right: 2px solid var(--fragment-lineno-border-color); + color: var(--fragment-lineno-foreground-color); + background-color: var(--fragment-lineno-background-color); + white-space: pre; +} +span.lineno a, span.lineno a:visited { + color: var(--fragment-lineno-link-fg-color); + background-color: var(--fragment-lineno-link-bg-color); +} + +span.lineno a:hover { + color: var(--fragment-lineno-link-hover-fg-color); + background-color: var(--fragment-lineno-link-hover-bg-color); +} + +.lineno { + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +div.classindex ul { + list-style: none; + padding-left: 0; +} + +div.classindex span.ai { + display: inline-block; +} + +div.groupHeader { + margin-left: 16px; + margin-top: 12px; + font-weight: bold; +} + +div.groupText { + margin-left: 16px; + font-style: italic; +} + +body { + color: var(--page-foreground-color); + margin: 0; +} + +div.contents { + margin-top: 10px; + margin-left: 12px; + margin-right: 8px; +} + +p.formulaDsp { + text-align: center; +} + +img.dark-mode-visible { + display: none; +} +img.light-mode-visible { + display: none; +} + +img.formulaInl, img.inline { + vertical-align: middle; +} + +div.center { + text-align: center; + margin-top: 0px; + margin-bottom: 0px; + padding: 0px; +} + +div.center img { + border: 0px; +} + +address.footer { + text-align: right; + padding-right: 12px; +} + +img.footer { + border: 0px; + vertical-align: middle; + width: var(--footer-logo-width); +} + +.compoundTemplParams { + color: var(--memdecl-template-color); + font-size: 80%; + line-height: 120%; +} + +/* @group Code Colorization */ + +span.keyword { + color: var(--code-keyword-color); +} + +span.keywordtype { + color: var(--code-type-keyword-color); +} + +span.keywordflow { + color: var(--code-flow-keyword-color); +} + +span.comment { + color: var(--code-comment-color); +} + +span.preprocessor { + color: var(--code-preprocessor-color); +} + +span.stringliteral { + color: var(--code-string-literal-color); +} + +span.charliteral { + color: var(--code-char-literal-color); +} + +span.xmlcdata { + color: var(--code-xml-cdata-color); +} + +span.vhdldigit { + color: var(--code-vhdl-digit-color); +} + +span.vhdlchar { + color: var(--code-vhdl-char-color); +} + +span.vhdlkeyword { + color: var(--code-vhdl-keyword-color); +} + +span.vhdllogic { + color: var(--code-vhdl-logic-color); +} + +blockquote { + background-color: var(--blockquote-background-color); + border-left: 2px solid var(--blockquote-border-color); + margin: 0 24px 0 4px; + padding: 0 12px 0 16px; +} + +/* @end */ + +td.tiny { + font-size: 75%; +} + +.dirtab { + padding: 4px; + border-collapse: collapse; + border: 1px solid var(--table-cell-border-color); +} + +th.dirtab { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-weight: bold; +} + +hr { + height: 0px; + border: none; + border-top: 1px solid var(--separator-color); +} + +hr.footer { + height: 1px; +} + +/* @group Member Descriptions */ + +table.memberdecls { + border-spacing: 0px; + padding: 0px; +} + +.memberdecls td, .fieldtable tr { + -webkit-transition-property: background-color, box-shadow; + -webkit-transition-duration: 0.5s; + -moz-transition-property: background-color, box-shadow; + -moz-transition-duration: 0.5s; + -ms-transition-property: background-color, box-shadow; + -ms-transition-duration: 0.5s; + -o-transition-property: background-color, box-shadow; + -o-transition-duration: 0.5s; + transition-property: background-color, box-shadow; + transition-duration: 0.5s; +} + +.memberdecls td.glow, .fieldtable tr.glow { + background-color: var(--glow-color); + box-shadow: 0 0 15px var(--glow-color); +} + +.mdescLeft, .mdescRight, +.memItemLeft, .memItemRight, +.memTemplItemLeft, .memTemplItemRight, .memTemplParams { + background-color: var(--memdecl-background-color); + border: none; + margin: 4px; + padding: 1px 0 0 8px; +} + +.mdescLeft, .mdescRight { + padding: 0px 8px 4px 8px; + color: var(--memdecl-foreground-color); +} + +.memSeparator { + border-bottom: 1px solid var(--memdecl-separator-color); + line-height: 1px; + margin: 0px; + padding: 0px; +} + +.memItemLeft, .memTemplItemLeft { + white-space: nowrap; +} + +.memItemRight, .memTemplItemRight { + width: 100%; +} + +.memTemplParams { + color: var(--memdecl-template-color); + white-space: nowrap; + font-size: 80%; +} + +/* @end */ + +/* @group Member Details */ + +/* Styles for detailed member documentation */ + +.memtitle { + padding: 8px; + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + border-top-right-radius: 4px; + border-top-left-radius: 4px; + margin-bottom: -1px; + background-image: var(--memdef-title-gradient-image); + background-repeat: repeat-x; + background-color: var(--memdef-title-background-color); + line-height: 1.25; + font-weight: 300; + float:left; +} + +.permalink +{ + font-size: 65%; + display: inline-block; + vertical-align: middle; +} + +.memtemplate { + font-size: 80%; + color: var(--memdef-template-color); + font-weight: normal; + margin-left: 9px; +} + +.mempage { + width: 100%; +} + +.memitem { + padding: 0; + margin-bottom: 10px; + margin-right: 5px; + -webkit-transition: box-shadow 0.5s linear; + -moz-transition: box-shadow 0.5s linear; + -ms-transition: box-shadow 0.5s linear; + -o-transition: box-shadow 0.5s linear; + transition: box-shadow 0.5s linear; + display: table !important; + width: 100%; +} + +.memitem.glow { + box-shadow: 0 0 15px var(--glow-color); +} + +.memname { + font-weight: 400; + margin-left: 6px; +} + +.memname td { + vertical-align: bottom; +} + +.memproto, dl.reflist dt { + border-top: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 0px 6px 0px; + color: var(--memdef-proto-text-color); + font-weight: bold; + text-shadow: var(--memdef-proto-text-shadow); + background-color: var(--memdef-proto-background-color); + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + border-top-right-radius: 4px; +} + +.overload { + font-family: var(--font-family-monospace); + font-size: 65%; +} + +.memdoc, dl.reflist dd { + border-bottom: 1px solid var(--memdef-border-color); + border-left: 1px solid var(--memdef-border-color); + border-right: 1px solid var(--memdef-border-color); + padding: 6px 10px 2px 10px; + border-top-width: 0; + background-image:url('nav_g.png'); + background-repeat:repeat-x; + background-color: var(--memdef-doc-background-color); + /* opera specific markup */ + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); + /* firefox specific markup */ + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-bottomright: 4px; + -moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px; + /* webkit specific markup */ + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +dl.reflist dt { + padding: 5px; +} + +dl.reflist dd { + margin: 0px 0px 10px 0px; + padding: 5px; +} + +.paramkey { + text-align: right; +} + +.paramtype { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; +} + +.paramname { + white-space: nowrap; + padding: 0px; + padding-bottom: 1px; + margin-left: 2px; +} + +.paramname em { + color: var(--memdef-param-name-color); + font-style: normal; + margin-right: 1px; +} + +.paramname .paramdefval { + font-family: var(--font-family-monospace); +} + +.params, .retval, .exception, .tparams { + margin-left: 0px; + padding-left: 0px; +} + +.params .paramname, .retval .paramname, .tparams .paramname, .exception .paramname { + font-weight: bold; + vertical-align: top; +} + +.params .paramtype, .tparams .paramtype { + font-style: italic; + vertical-align: top; +} + +.params .paramdir, .tparams .paramdir { + font-family: var(--font-family-monospace); + vertical-align: top; +} + +table.mlabels { + border-spacing: 0px; +} + +td.mlabels-left { + width: 100%; + padding: 0px; +} + +td.mlabels-right { + vertical-align: bottom; + padding: 0px; + white-space: nowrap; +} + +span.mlabels { + margin-left: 8px; +} + +span.mlabel { + background-color: var(--label-background-color); + border-top:1px solid var(--label-left-top-border-color); + border-left:1px solid var(--label-left-top-border-color); + border-right:1px solid var(--label-right-bottom-border-color); + border-bottom:1px solid var(--label-right-bottom-border-color); + text-shadow: none; + color: var(--label-foreground-color); + margin-right: 4px; + padding: 2px 3px; + border-radius: 3px; + font-size: 7pt; + white-space: nowrap; + vertical-align: middle; +} + + + +/* @end */ + +/* these are for tree view inside a (index) page */ + +div.directory { + margin: 10px 0px; + border-top: 1px solid var(--directory-separator-color); + border-bottom: 1px solid var(--directory-separator-color); + width: 100%; +} + +.directory table { + border-collapse:collapse; +} + +.directory td { + margin: 0px; + padding: 0px; + vertical-align: top; +} + +.directory td.entry { + white-space: nowrap; + padding-right: 6px; + padding-top: 3px; +} + +.directory td.entry a { + outline:none; +} + +.directory td.entry a img { + border: none; +} + +.directory td.desc { + width: 100%; + padding-left: 6px; + padding-right: 6px; + padding-top: 3px; + border-left: 1px solid rgba(0,0,0,0.05); +} + +.directory tr.odd { + padding-left: 6px; + background-color: var(--index-odd-item-bg-color); +} + +.directory tr.even { + padding-left: 6px; + background-color: var(--index-even-item-bg-color); +} + +.directory img { + vertical-align: -30%; +} + +.directory .levels { + white-space: nowrap; + width: 100%; + text-align: right; + font-size: 9pt; +} + +.directory .levels span { + cursor: pointer; + padding-left: 2px; + padding-right: 2px; + color: var(--page-link-color); +} + +.arrow { + color: var(--nav-arrow-color); + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + cursor: pointer; + font-size: 80%; + display: inline-block; + width: 16px; + height: 22px; +} + +.icon { + font-family: var(--font-family-icon); + line-height: normal; + font-weight: bold; + font-size: 12px; + height: 14px; + width: 16px; + display: inline-block; + background-color: var(--icon-background-color); + color: var(--icon-foreground-color); + text-align: center; + border-radius: 4px; + margin-left: 2px; + margin-right: 2px; +} + +.icona { + width: 24px; + height: 22px; + display: inline-block; +} + +.iconfopen { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-open-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.iconfclosed { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-folder-closed-image); + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +.icondoc { + width: 24px; + height: 18px; + margin-bottom: 4px; + background-image:var(--icon-doc-image); + background-position: 0px -4px; + background-repeat: repeat-y; + vertical-align:top; + display: inline-block; +} + +/* @end */ + +div.dynheader { + margin-top: 8px; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +address { + font-style: normal; + color: var(--footer-foreground-color); +} + +table.doxtable caption { + caption-side: top; +} + +table.doxtable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.doxtable td, table.doxtable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.doxtable th { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +table.fieldtable { + margin-bottom: 10px; + border: 1px solid var(--memdef-border-color); + border-spacing: 0px; + border-radius: 4px; + box-shadow: 2px 2px 2px rgba(0, 0, 0, 0.15); +} + +.fieldtable td, .fieldtable th { + padding: 3px 7px 2px; +} + +.fieldtable td.fieldtype, .fieldtable td.fieldname { + white-space: nowrap; + border-right: 1px solid var(--memdef-border-color); + border-bottom: 1px solid var(--memdef-border-color); + vertical-align: top; +} + +.fieldtable td.fieldname { + padding-top: 3px; +} + +.fieldtable td.fielddoc { + border-bottom: 1px solid var(--memdef-border-color); +} + +.fieldtable td.fielddoc p:first-child { + margin-top: 0px; +} + +.fieldtable td.fielddoc p:last-child { + margin-bottom: 2px; +} + +.fieldtable tr:last-child td { + border-bottom: none; +} + +.fieldtable th { + background-image: var(--memdef-title-gradient-image); + background-repeat:repeat-x; + background-color: var(--memdef-title-background-color); + font-size: 90%; + color: var(--memdef-proto-text-color); + padding-bottom: 4px; + padding-top: 5px; + text-align:left; + font-weight: 400; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom: 1px solid var(--memdef-border-color); +} + + +.tabsearch { + top: 0px; + left: 10px; + height: 36px; + background-image: var(--nav-gradient-image); + z-index: 101; + overflow: hidden; + font-size: 13px; +} + +.navpath ul +{ + font-size: 11px; + background-image: var(--nav-gradient-image); + background-repeat:repeat-x; + background-position: 0 -5px; + height:30px; + line-height:30px; + color:var(--nav-text-normal-color); + border:solid 1px var(--nav-breadcrumb-border-color); + overflow:hidden; + margin:0px; + padding:0px; +} + +.navpath li +{ + list-style-type:none; + float:left; + padding-left:10px; + padding-right:15px; + background-image:var(--nav-breadcrumb-image); + background-repeat:no-repeat; + background-position:right; + color: var(--nav-foreground-color); +} + +.navpath li.navelem a +{ + height:32px; + display:block; + outline: none; + color: var(--nav-text-normal-color); + font-family: var(--font-family-nav); + text-shadow: var(--nav-text-normal-shadow); + text-decoration: none; +} + +.navpath li.navelem a:hover +{ + color: var(--nav-text-hover-color); + text-shadow: var(--nav-text-hover-shadow); +} + +.navpath li.footer +{ + list-style-type:none; + float:right; + padding-left:10px; + padding-right:15px; + background-image:none; + background-repeat:no-repeat; + background-position:right; + color: var(--footer-foreground-color); + font-size: 8pt; +} + + +div.summary +{ + float: right; + font-size: 8pt; + padding-right: 5px; + width: 50%; + text-align: right; +} + +div.summary a +{ + white-space: nowrap; +} + +table.classindex +{ + margin: 10px; + white-space: nowrap; + margin-left: 3%; + margin-right: 3%; + width: 94%; + border: 0; + border-spacing: 0; + padding: 0; +} + +div.ingroups +{ + font-size: 8pt; + width: 50%; + text-align: left; +} + +div.ingroups a +{ + white-space: nowrap; +} + +div.header +{ + background-image: var(--header-gradient-image); + background-repeat:repeat-x; + background-color: var(--header-background-color); + margin: 0px; + border-bottom: 1px solid var(--header-separator-color); +} + +div.headertitle +{ + padding: 5px 5px 5px 10px; +} + +.PageDocRTL-title div.headertitle { + text-align: right; + direction: rtl; +} + +dl { + padding: 0 0 0 0; +} + +/* + +dl.section { + margin-left: 0px; + padding-left: 0px; +} + +dl.note { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #D0C000; +} + +dl.warning, dl.attention { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #FF0000; +} + +dl.pre, dl.post, dl.invariant { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00D000; +} + +dl.deprecated { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #505050; +} + +dl.todo { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #00C0E0; +} + +dl.test { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #3030E0; +} + +dl.bug { + margin-left: -7px; + padding-left: 3px; + border-left: 4px solid; + border-color: #C08050; +} + +*/ + +dl.bug dt a, dl.deprecated dt a, dl.todo dt a, dl.test a { + font-weight: bold !important; +} + +dl.warning, dl.attention, dl.note, dl.deprecated, dl.bug, +dl.invariant, dl.pre, dl.post, dl.todo, dl.test, dl.remark { + padding: 10px; + margin: 10px 0px; + overflow: hidden; + margin-left: 0; + border-radius: 4px; +} + +dl.section dd { + margin-bottom: 2px; +} + +dl.warning, dl.attention { + background: var(--warning-color-bg); + border-left: 8px solid var(--warning-color-hl); + color: var(--warning-color-text); +} + +dl.warning dt, dl.attention dt { + color: var(--warning-color-hl); +} + +dl.note, dl.remark { + background: var(--note-color-bg); + border-left: 8px solid var(--note-color-hl); + color: var(--note-color-text); +} + +dl.note dt, dl.remark dt { + color: var(--note-color-hl); +} + +dl.todo { + background: var(--todo-color-bg); + border-left: 8px solid var(--todo-color-hl); + color: var(--todo-color-text); +} + +dl.todo dt { + color: var(--todo-color-hl); +} + +dl.test { + background: var(--test-color-bg); + border-left: 8px solid var(--test-color-hl); + color: var(--test-color-text); +} + +dl.test dt { + color: var(--test-color-hl); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.bug { + background: var(--bug-color-bg); + border-left: 8px solid var(--bug-color-hl); + color: var(--bug-color-text); +} + +dl.bug dt a { + color: var(--bug-color-hl) !important; +} + +dl.deprecated { + background: var(--deprecated-color-bg); + border-left: 8px solid var(--deprecated-color-hl); + color: var(--deprecated-color-text); +} + +dl.deprecated dt a { + color: var(--deprecated-color-hl) !important; +} + +dl.section dd, dl.bug dd, dl.deprecated dd, dl.todo dd, dl.test dd { + margin-inline-start: 0px; +} + +dl.invariant, dl.pre, dl.post { + background: var(--invariant-color-bg); + border-left: 8px solid var(--invariant-color-hl); + color: var(--invariant-color-text); +} + +dl.invariant dt, dl.pre dt, dl.post dt { + color: var(--invariant-color-hl); +} + + +#projectrow +{ + height: 56px; +} + +#projectlogo +{ + text-align: center; + vertical-align: bottom; + border-collapse: separate; +} + +#projectlogo img +{ + border: 0px none; +} + +#projectalign +{ + vertical-align: middle; + padding-left: 0.5em; +} + +#projectname +{ + font-size: 200%; + font-family: var(--font-family-title); + margin: 0px; + padding: 2px 0px; +} + +#projectbrief +{ + font-size: 90%; + font-family: var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#projectnumber +{ + font-size: 50%; + font-family: 50% var(--font-family-title); + margin: 0px; + padding: 0px; +} + +#titlearea +{ + padding: 0px; + margin: 0px; + width: 100%; + border-bottom: 1px solid var(--title-separator-color); + background-color: var(--title-background-color); +} + +.image +{ + text-align: center; +} + +.dotgraph +{ + text-align: center; +} + +.mscgraph +{ + text-align: center; +} + +.plantumlgraph +{ + text-align: center; +} + +.diagraph +{ + text-align: center; +} + +.caption +{ + font-weight: bold; +} + +dl.citelist { + margin-bottom:50px; +} + +dl.citelist dt { + color:var(--citation-label-color); + float:left; + font-weight:bold; + margin-right:10px; + padding:5px; + text-align:right; + width:52px; +} + +dl.citelist dd { + margin:2px 0 2px 72px; + padding:5px 0; +} + +div.toc { + padding: 14px 25px; + background-color: var(--toc-background-color); + border: 1px solid var(--toc-border-color); + border-radius: 7px 7px 7px 7px; + float: right; + height: auto; + margin: 0 8px 10px 10px; + width: 200px; +} + +div.toc li { + background: var(--toc-down-arrow-image) no-repeat scroll 0 5px transparent; + font: 10px/1.2 var(--font-family-toc); + margin-top: 5px; + padding-left: 10px; + padding-top: 2px; +} + +div.toc h3 { + font: bold 12px/1.2 var(--font-family-toc); + color: var(--toc-header-color); + border-bottom: 0 none; + margin: 0; +} + +div.toc ul { + list-style: none outside none; + border: medium none; + padding: 0px; +} + +div.toc li.level1 { + margin-left: 0px; +} + +div.toc li.level2 { + margin-left: 15px; +} + +div.toc li.level3 { + margin-left: 15px; +} + +div.toc li.level4 { + margin-left: 15px; +} + +span.emoji { + /* font family used at the site: https://unicode.org/emoji/charts/full-emoji-list.html + * font-family: "Noto Color Emoji", "Apple Color Emoji", "Segoe UI Emoji", Times, Symbola, Aegyptus, Code2000, Code2001, Code2002, Musica, serif, LastResort; + */ +} + +span.obfuscator { + display: none; +} + +.inherit_header { + font-weight: bold; + color: var(--inherit-header-color); + cursor: pointer; + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.inherit_header td { + padding: 6px 0px 2px 5px; +} + +.inherit { + display: none; +} + +tr.heading h2 { + margin-top: 12px; + margin-bottom: 4px; +} + +/* tooltip related style info */ + +.ttc { + position: absolute; + display: none; +} + +#powerTip { + cursor: default; + /*white-space: nowrap;*/ + color: var(--tooltip-foreground-color); + background-color: var(--tooltip-background-color); + border: 1px solid var(--tooltip-border-color); + border-radius: 4px 4px 4px 4px; + box-shadow: var(--tooltip-shadow); + display: none; + font-size: smaller; + max-width: 80%; + opacity: 0.9; + padding: 1ex 1em 1em; + position: absolute; + z-index: 2147483647; +} + +#powerTip div.ttdoc { + color: var(--tooltip-doc-color); + font-style: italic; +} + +#powerTip div.ttname a { + font-weight: bold; +} + +#powerTip a { + color: var(--tooltip-link-color); +} + +#powerTip div.ttname { + font-weight: bold; +} + +#powerTip div.ttdeci { + color: var(--tooltip-declaration-color); +} + +#powerTip div { + margin: 0px; + padding: 0px; + font-size: 12px; + font-family: var(--font-family-tooltip); + line-height: 16px; +} + +#powerTip:before, #powerTip:after { + content: ""; + position: absolute; + margin: 0px; +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.s:after, #powerTip.s:before, +#powerTip.w:after, #powerTip.w:before, +#powerTip.e:after, #powerTip.e:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.nw:after, #powerTip.nw:before, +#powerTip.sw:after, #powerTip.sw:before { + border: solid transparent; + content: " "; + height: 0; + width: 0; + position: absolute; +} + +#powerTip.n:after, #powerTip.s:after, +#powerTip.w:after, #powerTip.e:after, +#powerTip.nw:after, #powerTip.ne:after, +#powerTip.sw:after, #powerTip.se:after { + border-color: rgba(255, 255, 255, 0); +} + +#powerTip.n:before, #powerTip.s:before, +#powerTip.w:before, #powerTip.e:before, +#powerTip.nw:before, #powerTip.ne:before, +#powerTip.sw:before, #powerTip.se:before { + border-color: rgba(128, 128, 128, 0); +} + +#powerTip.n:after, #powerTip.n:before, +#powerTip.ne:after, #powerTip.ne:before, +#powerTip.nw:after, #powerTip.nw:before { + top: 100%; +} + +#powerTip.n:after, #powerTip.ne:after, #powerTip.nw:after { + border-top-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} +#powerTip.n:before, #powerTip.ne:before, #powerTip.nw:before { + border-top-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} +#powerTip.n:after, #powerTip.n:before { + left: 50%; +} + +#powerTip.nw:after, #powerTip.nw:before { + right: 14px; +} + +#powerTip.ne:after, #powerTip.ne:before { + left: 14px; +} + +#powerTip.s:after, #powerTip.s:before, +#powerTip.se:after, #powerTip.se:before, +#powerTip.sw:after, #powerTip.sw:before { + bottom: 100%; +} + +#powerTip.s:after, #powerTip.se:after, #powerTip.sw:after { + border-bottom-color: var(--tooltip-background-color); + border-width: 10px; + margin: 0px -10px; +} + +#powerTip.s:before, #powerTip.se:before, #powerTip.sw:before { + border-bottom-color: var(--tooltip-border-color); + border-width: 11px; + margin: 0px -11px; +} + +#powerTip.s:after, #powerTip.s:before { + left: 50%; +} + +#powerTip.sw:after, #powerTip.sw:before { + right: 14px; +} + +#powerTip.se:after, #powerTip.se:before { + left: 14px; +} + +#powerTip.e:after, #powerTip.e:before { + left: 100%; +} +#powerTip.e:after { + border-left-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.e:before { + border-left-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +#powerTip.w:after, #powerTip.w:before { + right: 100%; +} +#powerTip.w:after { + border-right-color: var(--tooltip-border-color); + border-width: 10px; + top: 50%; + margin-top: -10px; +} +#powerTip.w:before { + border-right-color: var(--tooltip-border-color); + border-width: 11px; + top: 50%; + margin-top: -11px; +} + +@media print +{ + #top { display: none; } + #side-nav { display: none; } + #nav-path { display: none; } + body { overflow:visible; } + h1, h2, h3, h4, h5, h6 { page-break-after: avoid; } + .summary { display: none; } + .memitem { page-break-inside: avoid; } + #doc-content + { + margin-left:0 !important; + height:auto !important; + width:auto !important; + overflow:inherit; + display:inline; + } +} + +/* @group Markdown */ + +table.markdownTable { + border-collapse:collapse; + margin-top: 4px; + margin-bottom: 4px; +} + +table.markdownTable td, table.markdownTable th { + border: 1px solid var(--table-cell-border-color); + padding: 3px 7px 2px; +} + +table.markdownTable tr { +} + +th.markdownTableHeadLeft, th.markdownTableHeadRight, th.markdownTableHeadCenter, th.markdownTableHeadNone { + background-color: var(--table-header-background-color); + color: var(--table-header-foreground-color); + font-size: 110%; + padding-bottom: 4px; + padding-top: 5px; +} + +th.markdownTableHeadLeft, td.markdownTableBodyLeft { + text-align: left +} + +th.markdownTableHeadRight, td.markdownTableBodyRight { + text-align: right +} + +th.markdownTableHeadCenter, td.markdownTableBodyCenter { + text-align: center +} + +tt, code, kbd, samp +{ + display: inline-block; +} +/* @end */ + +u { + text-decoration: underline; +} + +details>summary { + list-style-type: none; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details>summary::before { + content: "\25ba"; + padding-right:4px; + font-size: 80%; +} + +details[open]>summary::before { + content: "\25bc"; + padding-right:4px; + font-size: 80%; +} + diff --git a/doxygen.svg b/doxygen.svg new file mode 100644 index 0000000..48b8880 --- /dev/null +++ b/doxygen.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/doxygen_crawl.html b/doxygen_crawl.html new file mode 100644 index 0000000..a8890b1 --- /dev/null +++ b/doxygen_crawl.html @@ -0,0 +1,107 @@ + + + +Validator / crawler helper + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/dynsections.js b/dynsections.js new file mode 100644 index 0000000..8f49326 --- /dev/null +++ b/dynsections.js @@ -0,0 +1,194 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ + +let dynsection = { + + // helper function + updateStripes : function() { + $('table.directory tr'). + removeClass('even').filter(':visible:even').addClass('even'); + $('table.directory tr'). + removeClass('odd').filter(':visible:odd').addClass('odd'); + }, + + toggleVisibility : function(linkObj) { + const base = $(linkObj).attr('id'); + const summary = $('#'+base+'-summary'); + const content = $('#'+base+'-content'); + const trigger = $('#'+base+'-trigger'); + const src=$(trigger).attr('src'); + if (content.is(':visible')===true) { + content.hide(); + summary.show(); + $(linkObj).addClass('closed').removeClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-8)+'closed.png'); + } else { + content.show(); + summary.hide(); + $(linkObj).removeClass('closed').addClass('opened'); + $(trigger).attr('src',src.substring(0,src.length-10)+'open.png'); + } + return false; + }, + + toggleLevel : function(level) { + $('table.directory tr').each(function() { + const l = this.id.split('_').length-1; + const i = $('#img'+this.id.substring(3)); + const a = $('#arr'+this.id.substring(3)); + if (l'); + // add vertical lines to other rows + $('span[class=lineno]').not(':eq(0)').append(''); + // add toggle controls to lines with fold divs + $('div[class=foldopen]').each(function() { + // extract specific id to use + const id = $(this).attr('id').replace('foldopen',''); + // extract start and end foldable fragment attributes + const start = $(this).attr('data-start'); + const end = $(this).attr('data-end'); + // replace normal fold span with controls for the first line of a foldable fragment + $(this).find('span[class=fold]:first').replaceWith(''); + // append div for folded (closed) representation + $(this).after(''); + // extract the first line from the "open" section to represent closed content + const line = $(this).children().first().clone(); + // remove any glow that might still be active on the original line + $(line).removeClass('glow'); + if (start) { + // if line already ends with a start marker (e.g. trailing {), remove it + $(line).html($(line).html().replace(new RegExp('\\s*'+start+'\\s*$','g'),'')); + } + // replace minus with plus symbol + $(line).find('span[class=fold]').css('background-image',codefold.plusImg[relPath]); + // append ellipsis + $(line).append(' '+start+''+end); + // insert constructed line into closed div + $('#foldclosed'+id).html(line); + }); + }, +}; +/* @license-end */ diff --git a/files.html b/files.html new file mode 100644 index 0000000..0325913 --- /dev/null +++ b/files.html @@ -0,0 +1,91 @@ + + + + + + + +libmseed: File List + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
File List
+
+
+
Here is a list of all documented files with brief descriptions:
+ + +
 libmseed.h
+
+
+ + + + + diff --git a/folderclosed.svg b/folderclosed.svg new file mode 100644 index 0000000..39a9b0b --- /dev/null +++ b/folderclosed.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderclosedd.svg b/folderclosedd.svg new file mode 100644 index 0000000..9a8cd43 --- /dev/null +++ b/folderclosedd.svg @@ -0,0 +1,11 @@ + + + + + + + + + + diff --git a/folderopen.svg b/folderopen.svg new file mode 100644 index 0000000..6b31d35 --- /dev/null +++ b/folderopen.svg @@ -0,0 +1,17 @@ + + + + + + + + + + diff --git a/folderopend.svg b/folderopend.svg new file mode 100644 index 0000000..45a8b15 --- /dev/null +++ b/folderopend.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/functions.html b/functions.html new file mode 100644 index 0000000..9b8da89 --- /dev/null +++ b/functions.html @@ -0,0 +1,264 @@ + + + + + + + +libmseed: Data Fields + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented struct and union fields with links to the struct/union documentation for each field:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+
+ + + + + diff --git a/functions_eval.html b/functions_eval.html new file mode 100644 index 0000000..597ae7f --- /dev/null +++ b/functions_eval.html @@ -0,0 +1,89 @@ + + + + + + + +libmseed: Data Fields - Enumerator + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented enum values with links to the struct/union documentation for each field:
+
+ + + + + diff --git a/functions_vars.html b/functions_vars.html new file mode 100644 index 0000000..d290039 --- /dev/null +++ b/functions_vars.html @@ -0,0 +1,260 @@ + + + + + + + +libmseed: Data Fields - Variables + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the struct/union documentation for each field:
+ +

- a -

+ + +

- b -

+ + +

- c -

+ + +

- d -

+ + +

- e -

+ + +

- f -

+ + +

- h -

+ + +

- i -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- o -

+ + +

- p -

+ + +

- r -

+ + +

- s -

+ + +

- t -

+ + +

- u -

+ + +

- v -

+ + +

- w -

+
+ + + + + diff --git a/globals.html b/globals.html new file mode 100644 index 0000000..33d7281 --- /dev/null +++ b/globals.html @@ -0,0 +1,298 @@ + + + + + + + +libmseed: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions, variables, defines, enums, and typedefs with links to the documentation:
+ +

- b -

+ + +

- d -

+ + +

- f -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+
+ + + + + diff --git a/globals_defs.html b/globals_defs.html new file mode 100644 index 0000000..a89d161 --- /dev/null +++ b/globals_defs.html @@ -0,0 +1,187 @@ + + + + + + + +libmseed: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented macros with links to the documentation:
+ +

- b -

+ + +

- d -

+ + +

- l -

+ + +

- m -

+ + +

- n -

+ + +

- p -

+
+ + + + + diff --git a/globals_enum.html b/globals_enum.html new file mode 100644 index 0000000..0746d74 --- /dev/null +++ b/globals_enum.html @@ -0,0 +1,87 @@ + + + + + + + +libmseed: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented enums with links to the documentation:
+
+ + + + + diff --git a/globals_func.html b/globals_func.html new file mode 100644 index 0000000..9b6202b --- /dev/null +++ b/globals_func.html @@ -0,0 +1,190 @@ + + + + + + + +libmseed: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented functions with links to the documentation:
+ +

- l -

+ + +

- m -

+
+ + + + + diff --git a/globals_type.html b/globals_type.html new file mode 100644 index 0000000..b85042e --- /dev/null +++ b/globals_type.html @@ -0,0 +1,88 @@ + + + + + + + +libmseed: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented typedefs with links to the documentation:
+
+ + + + + diff --git a/globals_vars.html b/globals_vars.html new file mode 100644 index 0000000..f1508a7 --- /dev/null +++ b/globals_vars.html @@ -0,0 +1,88 @@ + + + + + + + +libmseed: Globals + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
Here is a list of all documented variables with links to the documentation:
+
+ + + + + diff --git a/group__byte-swap-flags.html b/group__byte-swap-flags.html new file mode 100644 index 0000000..5fde807 --- /dev/null +++ b/group__byte-swap-flags.html @@ -0,0 +1,106 @@ + + + + + + + +libmseed: Byte swap flags + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Byte swap flags
+
+
+ +

Flags indicating whether the header or payload needed byte swapping. +More...

+ + + + + + + + +

+Macros

+#define MSSWAP_HEADER   0x01
 Header needed byte swapping.
 
+#define MSSWAP_PAYLOAD   0x02
 Data payload needed byte swapping.
 
+

Detailed Description

+

Flags indicating whether the header or payload needed byte swapping.

+

These are bit flags normally used to set/test the MS3Record.swapflag value.

+
+ + + + + diff --git a/group__control-flags.html b/group__control-flags.html new file mode 100644 index 0000000..c69f68c --- /dev/null +++ b/group__control-flags.html @@ -0,0 +1,138 @@ + + + + + + + +libmseed: Control flags + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ + +
+
+ +

Parsing, packing and trace construction control flags. +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define MSF_UNPACKDATA   0x0001
 [Parsing] Unpack data samples
 
+#define MSF_SKIPNOTDATA   0x0002
 [Parsing] Skip input that cannot be identified as miniSEED
 
+#define MSF_VALIDATECRC   0x0004
 [Parsing] Validate CRC (if version 3)
 
+#define MSF_PNAMERANGE   0x0008
 [Parsing] Parse and utilize byte range from path name suffix
 
+#define MSF_ATENDOFFILE   0x0010
 [Parsing] Reading routine is at the end of the file
 
+#define MSF_SEQUENCE   0x0020
 [Packing] UNSUPPORTED: Maintain a record-level sequence number
 
+#define MSF_FLUSHDATA   0x0040
 [Packing] Pack all available data even if final record would not be filled
 
+#define MSF_PACKVER2   0x0080
 [Packing] Pack as miniSEED version 2 instead of 3
 
+#define MSF_RECORDLIST   0x0100
 [TraceList] Build a MS3RecordList for each MS3TraceSeg
 
+#define MSF_MAINTAINMSTL   0x0200
 [TraceList] Do not modify a trace list when packing
 
+

Detailed Description

+

Parsing, packing and trace construction control flags.

+

These are bit flags that can be combined into a bitmask to control aspects of the library's parsing, packing and trace managment routines.

+
+ + + + + diff --git a/group__data-selections.html b/group__data-selections.html new file mode 100644 index 0000000..4c46c59 --- /dev/null +++ b/group__data-selections.html @@ -0,0 +1,581 @@ + + + + + + + +libmseed: Data Selections + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Data Selections
+
+
+ +

Data selections to be used as filters. +More...

+ + + + + + + + +

+Data Structures

struct  MS3SelectTime
 Data selection structure time window definition containers. More...
 
struct  MS3Selections
 Data selection structure definition containers. More...
 
+ + + + + + + + + + + + + + + + + + + + + + +

+Functions

const MS3Selectionsms3_matchselect (const MS3Selections *selections, const char *sid, nstime_t starttime, nstime_t endtime, int pubversion, const MS3SelectTime **ppselecttime)
 Test the specified parameters for a matching selection entry.
 
const MS3Selectionsmsr3_matchselect (const MS3Selections *selections, const MS3Record *msr, const MS3SelectTime **ppselecttime)
 Test the MS3Record for a matching selection entry.
 
int ms3_addselect (MS3Selections **ppselections, const char *sidpattern, nstime_t starttime, nstime_t endtime, uint8_t pubversion)
 Add selection parameters to selection list.
 
int ms3_addselect_comp (MS3Selections **ppselections, char *network, char *station, char *location, char *channel, nstime_t starttime, nstime_t endtime, uint8_t pubversion)
 Add selection parameters to a selection list based on separate source name codes.
 
int ms3_readselectionsfile (MS3Selections **ppselections, const char *filename)
 Read data selections from a file.
 
void ms3_freeselections (MS3Selections *selections)
 Free all memory associated with a MS3Selections.
 
void ms3_printselections (const MS3Selections *selections)
 Print the selections list using the ms_log() facility.
 
+

Detailed Description

+

Data selections to be used as filters.

+

Selections are the identification of data, by source identifier and time ranges, that are desired. Capability is included to read selections from files and to match data against a selection list.

+

For data to be selected it must only match one of the selection entries. In other words, multiple selection entries are treated with OR logic.

+

The ms3_readmsr_selection() and ms3_readtracelist_selection() routines accept MS3Selections and allow selective (and efficient) reading of data from files.

+

Data Structure Documentation

+ +

◆ MS3SelectTime

+ +
+
+ + + + +
struct MS3SelectTime
+
+

Data selection structure time window definition containers.

+
+ + + + + + + + + + +
Data Fields
+nstime_t +starttime +Earliest data for matching channels, use NSTUNSET for open.
+nstime_t +endtime +Latest data for matching channels, use NSTUNSET for open.
+struct MS3SelectTime * +next +Pointer to next selection time, NULL if the last.
+ +
+
+ +

◆ MS3Selections

+ +
+
+ + + + +
struct MS3Selections
+
+

Data selection structure definition containers.

+
+ + + + + + + + + + + + + +
Data Fields
+char +sidpattern[100] +Matching (globbing) pattern for source ID.
+struct MS3SelectTime * +timewindows +Pointer to time window list for this source ID.
+struct MS3Selections * +next +Pointer to next selection, NULL if the last.
+uint8_t +pubversion +Selected publication version, use 0 for any.
+ +
+
+

Function Documentation

+ +

◆ ms3_matchselect()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
const MS3Selections * ms3_matchselect (const MS3Selections * selections,
const char * sid,
nstime_t starttime,
nstime_t endtime,
int pubversion,
const MS3SelectTime ** ppselecttime )
+
+extern
+
+ +

Test the specified parameters for a matching selection entry.

+

Search the MS3Selections for an entry matching the provided parameters. The MS3Selections.sidpattern may contain globbing characters. The MS3Selections.timewindows many contain start and end times set to NSTUNSET to denote "open" times.

+

Positive matching requires:

    +
  1. glob match of sid against sidpattern in selection
  2. +
  3. time window intersection with range in selection
  4. +
  5. equal pubversion if selection pubversion > 0
  6. +
+
Parameters
+ + + + + + + +
[in]selectionsMS3Selections to search
[in]sidSource ID to match
[in]starttimeStart time to match
[in]endtimeEnd time to match
[in]pubversionPublication version to match
[out]ppselecttimePointer-to-pointer to return the matching MS3SelectTime entry
+
+
+
Returns
A pointer to matching MS3Selections entry successful match and NULL for no match or error.
+ +
+
+ +

◆ msr3_matchselect()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
const MS3Selections * msr3_matchselect (const MS3Selections * selections,
const MS3Record * msr,
const MS3SelectTime ** ppselecttime )
+
+extern
+
+ +

Test the MS3Record for a matching selection entry.

+

Search the MS3Selections for an entry matching the provided parameters.

+

Positive matching requires:

    +
  1. glob match of sid against sidpattern in selection
  2. +
  3. time window intersection with range in selection
  4. +
  5. equal pubversion if selection pubversion > 0
  6. +
+
Parameters
+ + + + +
[in]selectionsMS3Selections to search
[in]msrMS3Record to match against selections
[out]ppselecttimePointer-to-pointer to return the matching MS3SelectTime entry
+
+
+
Returns
A pointer to matching MS3Selections entry successful match and NULL for no match or error.
+ +
+
+ +

◆ ms3_addselect()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms3_addselect (MS3Selections ** ppselections,
const char * sidpattern,
nstime_t starttime,
nstime_t endtime,
uint8_t pubversion )
+
+extern
+
+ +

Add selection parameters to selection list.

+

The sidpattern may contain globbing characters.

+

The starttime and endtime may be set to NSTUNSET to denote "open" times.

+

The pubversion may be set to 0 to match any publication version.

+
Parameters
+ + + + + + +
[in]ppselectionsMS3Selections to add new selection to
[in]sidpatternSource ID pattern, may contain globbing characters
[in]starttimeStart time for selection, NSTUNSET for open
[in]endtimeEnd time for selection, NSTUNSET for open
[in]pubversionPublication version for selection, 0 for any
+
+
+
Returns
0 on success and -1 on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_addselect_comp()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms3_addselect_comp (MS3Selections ** ppselections,
char * network,
char * station,
char * location,
char * channel,
nstime_t starttime,
nstime_t endtime,
uint8_t pubversion )
+
+extern
+
+ +

Add selection parameters to a selection list based on separate source name codes.

+

The network, station, location, and channel arguments may contain globbing parameters.

+

The starttime and endtime may be set to NSTUNSET to denote "open" times.

+

The pubversion may be set to 0 to match any publication version.

+

If any of the naming parameters are not supplied (pointer is NULL) a wildcard for all matches is substituted.

+

As a special case, if the location code (loc) is set to "--" to match an empty location code it will be translated to an empty string to match libmseed's notation.

+
Parameters
+ + + + + + + + + +
[in]ppselectionsMS3Selections to add new selection to
[in]networkNetwork code, may contain globbing characters
[in]stationStatoin code, may contain globbing characters
[in]locationLocation code, may contain globbing characters
[in]channelchannel code, may contain globbing characters
[in]starttimeStart time for selection, NSTUNSET for open
[in]endtimeEnd time for selection, NSTUNSET for open
[in]pubversionPublication version for selection, 0 for any
+
+
+
Returns
0 on success and -1 on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_readselectionsfile()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
int ms3_readselectionsfile (MS3Selections ** ppselections,
const char * filename )
+
+extern
+
+ +

Read data selections from a file.

+

Selections from a file are added to the specified selections list. On errors this routine will leave allocated memory unreachable (leaked), it is expected that this is a program failing condition.

+

As a special case if the filename is "-", selection lines will be read from stdin.

+

Each line of the file contains a single selection and may be one of these two line formats:

SourceID [Starttime [Endtime [Pubversion]]]
+

or

Network Station Location Channel [Pubversion [Starttime [Endtime]]]
+

The Starttime and Endtime values must be in a form recognized by ms_timestr2nstime() and include a full date (i.e. just a year is not allowed).

+

In the latter version, if the "Channel" field is a SEED 2.x channel (3-characters) it will automatically be converted into extended channel form (band_source_subsource).

+

In the latter version, the "Pubversion" field, which was "Quality" in earlier versions of the library, is assumed to be a publication version if it is an integer, otherwise it is ignored.

+
Returns
Count of selections added on success and -1 on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_freeselections()

+ +
+
+ + + + + +
+ + + + + + + +
void ms3_freeselections (MS3Selections * selections)
+
+extern
+
+ +

Free all memory associated with a MS3Selections.

+

All memory from one or more MS3Selections (in a linked list) are freed.

+
Parameters
+ + +
[in]selectionsStart of MS3Selections to free
+
+
+ +
+
+ +

◆ ms3_printselections()

+ +
+
+ + + + + +
+ + + + + + + +
void ms3_printselections (const MS3Selections * selections)
+
+extern
+
+ +

Print the selections list using the ms_log() facility.

+

All selections are printed with simple formatting.

+
Parameters
+ + +
[in]selectionsStart of MS3Selections to print
+
+
+ +
+
+
+ + + + + diff --git a/group__encoding-values.html b/group__encoding-values.html new file mode 100644 index 0000000..6f216cc --- /dev/null +++ b/group__encoding-values.html @@ -0,0 +1,150 @@ + + + + + + + +libmseed: Data Encodings + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Data Encodings
+
+
+ +

Data encoding type defines. +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define DE_TEXT   0
 Text encoding (UTF-8)
 
+#define DE_INT16   1
 16-bit integer
 
+#define DE_INT32   3
 32-bit integer
 
+#define DE_FLOAT32   4
 32-bit float (IEEE)
 
+#define DE_FLOAT64   5
 64-bit float (IEEE)
 
+#define DE_STEIM1   10
 Steim-1 compressed integers.
 
+#define DE_STEIM2   11
 Steim-2 compressed integers.
 
+#define DE_GEOSCOPE24   12
 [Legacy] GEOSCOPE 24-bit integer
 
+#define DE_GEOSCOPE163   13
 [Legacy] GEOSCOPE 16-bit gain ranged, 3-bit exponent
 
+#define DE_GEOSCOPE164   14
 [Legacy] GEOSCOPE 16-bit gain ranged, 4-bit exponent
 
+#define DE_CDSN   16
 [Legacy] CDSN 16-bit gain ranged
 
+#define DE_SRO   30
 [Legacy] SRO 16-bit gain ranged
 
+#define DE_DWWSSN   32
 [Legacy] DWWSSN 16-bit gain ranged
 
+

Detailed Description

+

Data encoding type defines.

+

These are FDSN-defined miniSEED data encoding values. The value of MS3Record.encoding is set to one of these. These values may be used anywhere and encoding value is needed.

+
+ + + + + diff --git a/group__extra-headers.html b/group__extra-headers.html new file mode 100644 index 0000000..a91293e --- /dev/null +++ b/group__extra-headers.html @@ -0,0 +1,1149 @@ + + + + + + + +libmseed: Extra Headers + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Extra Headers
+
+
+ +

Structures and funtions to support extra headers. +More...

+ + + + + + + + + + + + + + +

+Data Structures

struct  MSEHEventDetection
 Container for event detection parameters for use in extra headers. More...
 
struct  MSEHCalibration
 Container for calibration parameters for use in extra headers. More...
 
struct  MSEHTimingException
 Container for timing exception parameters for use in extra headers. More...
 
struct  MSEHRecenter
 Container for recenter parameters for use in extra headers. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define mseh_get(msr, ptr, valueptr, type, maxlength)    mseh_get_ptr_r (msr, ptr, valueptr, type, maxlength, NULL)
 A simple wrapper to access any type of extra header.
 
+#define mseh_get_number(msr, ptr, valueptr)    mseh_get_ptr_r (msr, ptr, valueptr, 'n', 0, NULL)
 A simple wrapper to access a number type extra header.
 
+#define mseh_get_int64(msr, ptr, valueptr)    mseh_get_ptr_r (msr, ptr, valueptr, 'i', 0, NULL)
 A simple wrapper to access a number type extra header.
 
+#define mseh_get_string(msr, ptr, buffer, maxlength)    mseh_get_ptr_r (msr, ptr, buffer, 's', maxlength, NULL)
 A simple wrapper to access a string type extra header.
 
+#define mseh_get_boolean(msr, ptr, valueptr)    mseh_get_ptr_r (msr, ptr, valueptr, 'b', 0, NULL)
 A simple wrapper to access a boolean type extra header.
 
+#define mseh_exists(msr, ptr)    (!mseh_get_ptr_r (msr, ptr, NULL, 0, 0, NULL))
 A simple wrapper to test existence of an extra header.
 
+#define mseh_set(msr, ptr, valueptr, type)    mseh_set_ptr_r (msr, ptr, valueptr, type, NULL)
 A simple wrapper to set any type of extra header.
 
+#define mseh_set_number(msr, ptr, valueptr)    mseh_set_ptr_r (msr, ptr, valueptr, 'n', NULL)
 A simple wrapper to set a number type extra header.
 
+#define mseh_set_int64(msr, ptr, valueptr)    mseh_set_ptr_r (msr, ptr, valueptr, 'i', NULL)
 A simple wrapper to set a number type extra header.
 
+#define mseh_set_string(msr, ptr, valueptr)    mseh_set_ptr_r (msr, ptr, valueptr, 's', NULL)
 A simple wrapper to set a string type extra header.
 
+#define mseh_set_boolean(msr, ptr, valueptr)    mseh_set_ptr_r (msr, ptr, valueptr, 'b', NULL)
 A simple wrapper to set a boolean type extra header.
 
+ + + + +

+Typedefs

typedef struct LM_PARSED_JSON_s LM_PARSED_JSON
 Internal structure for holding parsed JSON extra headers.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

int mseh_get_ptr_r (const MS3Record *msr, const char *ptr, void *value, char type, uint32_t maxlength, LM_PARSED_JSON **parsestate)
 Search for and return an extra header value.
 
int mseh_set_ptr_r (MS3Record *msr, const char *ptr, void *value, char type, LM_PARSED_JSON **parsestate)
 Set the value of extra header values.
 
int mseh_add_event_detection_r (MS3Record *msr, const char *ptr, MSEHEventDetection *eventdetection, LM_PARSED_JSON **parsestate)
 Add event detection to the extra headers of the given record.
 
int mseh_add_calibration_r (MS3Record *msr, const char *ptr, MSEHCalibration *calibration, LM_PARSED_JSON **parsestate)
 Add calibration to the extra headers of the given record.
 
int mseh_add_timing_exception_r (MS3Record *msr, const char *ptr, MSEHTimingException *exception, LM_PARSED_JSON **parsestate)
 Add timing exception to the extra headers of the given record.
 
int mseh_add_recenter_r (MS3Record *msr, const char *ptr, MSEHRecenter *recenter, LM_PARSED_JSON **parsestate)
 Add recenter event to the extra headers of the given record.
 
int mseh_serialize (MS3Record *msr, LM_PARSED_JSON **parsestate)
 Generate extra headers string (serialize) from internal state.
 
void mseh_free_parsestate (LM_PARSED_JSON **parsestate)
 Free internally parsed (deserialized) JSON data.
 
int mseh_replace (MS3Record *msr, char *jsonstring)
 Replace extra headers with supplied JSON.
 
int mseh_print (const MS3Record *msr, int indent)
 Print the extra header structure for the specified MS3Record.
 
+

Detailed Description

+

Structures and funtions to support extra headers.

+

Extra headers are stored as JSON within a data record header using an anonymous, root object as a container for all extra headers. For a full description consult the format specification.

+

The library functions supporting extra headers allow specific header identification using JSON Pointer identification. In this notation each path element is an object until the final element which is a key to specified header value.

+

For example, a path specified as:

"/objectA/objectB/header"
+

would correspond to the single JSON value in:

{
+
"objectA": {
+
"objectB": {
+
"header":VALUE
+
}
+
}
+
}
+

Data Structure Documentation

+ +

◆ MSEHEventDetection

+ +
+
+ + + + +
struct MSEHEventDetection
+
+

Container for event detection parameters for use in extra headers.

+

Actual values are optional, with special values indicating an unset state.

+
See also
mseh_add_event_detection_r
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Fields
+char +type[30] +

Detector type (e.g. "MURDOCK"), zero length = not included

+
+char +detector[30] +

Detector name, zero length = not included
+

+
+double +signalamplitude +

SignalAmplitude, 0.0 = not included

+
+double +signalperiod +

Signal period, 0.0 = not included

+
+double +backgroundestimate +

Background estimate, 0.0 = not included

+
+char +wave[30] +

Detection wave (e.g. "DILATATION"), zero length = not included

+
+char +units[30] +

Units of amplitude and background estimate (e.g. "COUNTS"), zero length = not included

+
+nstime_t +onsettime +

Onset time, NSTUNSET = not included

+
+uint8_t +medsnr[6] +

Signal to noise ratio for Murdock event detection, all zeros = not included

+
+int +medlookback +

Murdock event detection lookback value, -1 = not included

+
+int +medpickalgorithm +

Murdock event detection pick algoritm, -1 = not included

+
+struct MSEHEventDetection * +next +

Pointer to next, NULL if none

+
+ +
+
+ +

◆ MSEHCalibration

+ +
+
+ + + + +
struct MSEHCalibration
+
+

Container for calibration parameters for use in extra headers.

+

Actual values are optional, with special values indicating an unset state.

+
See also
mseh_add_calibration
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Fields
+char +type[30] +

Calibration type (e.g. "STEP", "SINE", "PSEUDORANDOM"), zero length = not included

+
+nstime_t +begintime +

Begin time, NSTUNSET = not included

+
+nstime_t +endtime +

End time, NSTUNSET = not included

+
+int +steps +

Number of step calibrations, -1 = not included

+
+int +firstpulsepositive +

Boolean, step cal. first pulse, -1 = not included

+
+int +alternatesign +

Boolean, step cal. alt. sign, -1 = not included

+
+char +trigger[30] +

Trigger, e.g. AUTOMATIC or MANUAL, zero length = not included

+
+int +continued +

Boolean, continued from prev. record, -1 = not included

+
+double +amplitude +

Amp. of calibration signal, 0.0 = not included

+
+char +inputunits[30] +

Units of input (e.g. volts, amps), zero length = not included

+
+char +amplituderange[30] +

E.g PEAKTOPTEAK, ZEROTOPEAK, RMS, RANDOM, zero length = not included

+
+double +duration +

Duration in seconds, 0.0 = not included

+
+double +sineperiod +

Period of sine, 0.0 = not included

+
+double +stepbetween +

Interval bewteen steps, 0.0 = not included

+
+char +inputchannel[30] +

Channel of input, zero length = not included

+
+double +refamplitude +

Reference amplitude, 0.0 = not included

+
+char +coupling[30] +

Coupling, e.g. Resistive, Capacitive, zero length = not included

+
+char +rolloff[30] +

Rolloff of filters, zero length = not included

+
+char +noise[30] +

Noise for PR cals, e.g. White or Red, zero length = not included

+
+struct MSEHCalibration * +next +

Pointer to next, NULL if none

+
+ +
+
+ +

◆ MSEHTimingException

+ +
+
+ + + + +
struct MSEHTimingException
+
+

Container for timing exception parameters for use in extra headers.

+

Actual values are optional, with special values indicating an unset state.

+
See also
mseh_add_timing_exception
+
+ + + + + + + + + + + + + + + + + + + + + + +
Data Fields
+nstime_t +time +

Time of exception, NSTUNSET = not included

+
+float +vcocorrection +

VCO correction, from 0 to 100%, <0 = not included

+
+int +usec +

[DEPRECATED] microsecond time offset, 0 = not included

+
+int +receptionquality +

Reception quality, 0 to 100% clock accurracy, <0 = not included

+
+uint32_t +count +

The count thereof, 0 = not included

+
+char +type[16] +

E.g. "MISSING" or "UNEXPECTED", zero length = not included

+
+char +clockstatus[128] +

Description of clock-specific parameters, zero length = not included

+
+ +
+
+ +

◆ MSEHRecenter

+ +
+
+ + + + +
struct MSEHRecenter
+
+

Container for recenter parameters for use in extra headers.

+

Actual values are optional, with special values indicating an unset state.

+
See also
mseh_add_recenter
+
+ + + + + + + + + + + + + +
Data Fields
+char +type[30] +

Recenter type (e.g. "MASS", "GIMBAL"), zero length = not included

+
+nstime_t +begintime +

Begin time, NSTUNSET = not included

+
+nstime_t +endtime +

Estimated end time, NSTUNSET = not included

+
+char +trigger[30] +

Trigger, e.g. AUTOMATIC or MANUAL, zero length = not included

+
+ +
+
+

Typedef Documentation

+ +

◆ LM_PARSED_JSON

+ +
+
+ + + + +
typedef struct LM_PARSED_JSON_s LM_PARSED_JSON
+
+ +

Internal structure for holding parsed JSON extra headers.

+
See also
mseh_get_ptr_r()
+
+mseh_set_ptr_r()
+ +
+
+

Function Documentation

+ +

◆ mseh_get_ptr_r()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int mseh_get_ptr_r (const MS3Record * msr,
const char * ptr,
void * value,
char type,
uint32_t maxlength,
LM_PARSED_JSON ** parsestate )
+
+extern
+
+ +

Search for and return an extra header value.

+

The extra header value is specified as a JSON Pointer (RFC 6901), e.g. '/objectA/objectB/header'.

+

This routine can get used to test for the existence of a value without returning the value by setting value to NULL.

+

If the target item is found (and value parameter is set) the value will be copied into the memory specified by value. The type value specifies the data type expected.

+

If a parsestate pointer is supplied, the parsed (deserialized) JSON data are stored here. This value may be used in subsequent calls to avoid re-parsing the JSON. The data must be freed with mseh_free_parsestate() when done reading the JSON. If this value is NULL the parse state will be created and destroyed on each call.

+
Parameters
+ + + + + + + +
[in]msrParsed miniSEED record to search
[in]ptrHeader value desired, as JSON Pointer
[out]valueBuffer for value, of type type
[in]typeType of value expected, one of:
    +
  • 'n' - value is type double
  • +
  • 'i' - value is type int64_t
  • +
  • 's' - value is type char* (maximum length is: maxlength - 1)
  • +
  • 'b' - value of type int (boolean value of 0 or 1)
  • +
+
[in]maxlengthMaximum length of string value
[in]parsestateParsed state for multiple operations, can be NULL
+
+
+
Return values
+ + + + +
0on success
1when the value was not found
2when the value is of a different type
+
+
+
Returns
A (negative) libmseed error code on error
+

MessageOnError - this function logs a message on error

+
See also
mseh_free_parsestate()
+ +
+
+ +

◆ mseh_set_ptr_r()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
int mseh_set_ptr_r (MS3Record * msr,
const char * ptr,
void * value,
char type,
LM_PARSED_JSON ** parsestate )
+
+extern
+
+ +

Set the value of extra header values.

+

The extra header value is specified as a JSON Pointer (RFC 6901), e.g. '/objectA/objectB/header'.

+

For most value types, if the ptr or final header values do not exist they will be created. If the header value exists it will be replaced. When the value type is 'M', for Merge Patch (RFC 7386), the location indicated by ptr must exist.

+

The type value specifies the data type expected for value.

+

If a parsestate pointer is supplied, the parsed (deserialized) JSON data are stored here. This value may be used in subsequent calls to avoid re-parsing the JSON. When done setting headers using this functionality the following must be done:

    +
  1. call mseh_serialize() to create the JSON headers before writing the record
  2. +
  3. free the parsestate data with mseh_free_parsestate() If this value is NULL the parse state will be created and destroyed on each call.
  4. +
+
Parameters
+ + + + + + +
[in]msrParsed miniSEED record to modify
[in]ptrHeader value to set as JSON Pointer, or JSON Merge Patch
[in]valueBuffer for value, of type type
[in]typeType of value expected, one of:
    +
  • 'n' - value is type double
  • +
  • 'i' - value is type int64_t
  • +
  • 's' - value is type char*
  • +
  • 'b' - value is type int (boolean value of 0 or 1)
  • +
  • 'M' - value is type char* and a Merge Patch to apply at ptr
  • +
  • 'V' - value is type yyjson_mut_val* to set/replace (internal use)
  • +
  • 'A' - value is type yyjson_mut_val* to append to array (internal use)
  • +
+
[in]parsestateParsed state for multiple operations, can be NULL
+
+
+
Return values
+ + +
0on success, otherwise a (negative) libmseed error code.
+
+
+

MessageOnError - this function logs a message on error

+
See also
mseh_free_parsestate()
+
+mseh_serialize()
+ +
+
+ +

◆ mseh_add_event_detection_r()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int mseh_add_event_detection_r (MS3Record * msr,
const char * ptr,
MSEHEventDetection * eventdetection,
LM_PARSED_JSON ** parsestate )
+
+extern
+
+ +

Add event detection to the extra headers of the given record.

+

If ptr is NULL, the default is '/FDSN/Event/Detection'.

+
Parameters
+ + + + + +
[in]msrParsed miniSEED record to query
[in]ptrHeader value desired, specified in dot notation
[in]eventdetectionStructure with event detection values
[in]parsestateParsed state for multiple operations, can be NULL
+
+
+
Returns
0 on success, otherwise a (negative) libmseed error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ mseh_add_calibration_r()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int mseh_add_calibration_r (MS3Record * msr,
const char * ptr,
MSEHCalibration * calibration,
LM_PARSED_JSON ** parsestate )
+
+extern
+
+ +

Add calibration to the extra headers of the given record.

+

If ptr is NULL, the default is '/FDSN/Calibration/Sequence'.

+
Parameters
+ + + + + +
[in]msrParsed miniSEED record to query
[in]ptrHeader value desired, specified in dot notation
[in]calibrationStructure with calibration values
[in]parsestateParsed state for multiple operations, can be NULL
+
+
+
Returns
0 on success, otherwise a (negative) libmseed error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ mseh_add_timing_exception_r()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int mseh_add_timing_exception_r (MS3Record * msr,
const char * ptr,
MSEHTimingException * exception,
LM_PARSED_JSON ** parsestate )
+
+extern
+
+ +

Add timing exception to the extra headers of the given record.

+

If ptr is NULL, the default is '/FDSN/Time/Exception'.

+
Parameters
+ + + + + +
[in]msrParsed miniSEED record to query
[in]ptrHeader value desired, specified in dot notation
[in]exceptionStructure with timing exception values
[in]parsestateParsed state for multiple operations, can be NULL
+
+
+
Returns
0 on success, otherwise a (negative) libmseed error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ mseh_add_recenter_r()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int mseh_add_recenter_r (MS3Record * msr,
const char * ptr,
MSEHRecenter * recenter,
LM_PARSED_JSON ** parsestate )
+
+extern
+
+ +

Add recenter event to the extra headers of the given record.

+

If ptr is NULL, the default is '/FDSN/Recenter/Sequence'.

+
Parameters
+ + + + + +
[in]msrParsed miniSEED record to query
[in]ptrHeader value desired, specified in dot notation
[in]recenterStructure with recenter values
[in]parsestateParsed state for multiple operations, can be NULL
+
+
+
Returns
0 on success, otherwise a (negative) libmseed error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ mseh_serialize()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
int mseh_serialize (MS3Record * msr,
LM_PARSED_JSON ** parsestate )
+
+extern
+
+ +

Generate extra headers string (serialize) from internal state.

+

Generate the extra headers JSON string from the internal parse state created by mseh_set_ptr_r().

+
Parameters
+ + + +
[in]msrMS3Record to generate extra headers for
[in]parsestateInternal parsed state associated with msr
+
+
+
Returns
Length of extra headers on success, otherwise a (negative) libmseed error code
+
See also
mseh_set_ptr_r()
+ +
+
+ +

◆ mseh_free_parsestate()

+ +
+
+ + + + + +
+ + + + + + + +
void mseh_free_parsestate (LM_PARSED_JSON ** parsestate)
+
+extern
+
+ +

Free internally parsed (deserialized) JSON data.

+

Free the memory associated with JSON data parsed by mseh_get_ptr_r() or mseh_set_ptr_r(), specifically the data at the parsestate pointer.

+
Parameters
+ + +
[in]parsestateInternal parsed state associated with msr
+
+
+
See also
mseh_get_ptr_r()
+
+mseh_set_ptr_r()
+ +
+
+ +

◆ mseh_replace()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
int mseh_replace (MS3Record * msr,
char * jsonstring )
+
+extern
+
+ +

Replace extra headers with supplied JSON.

+

Parse the supplied JSON string, re-serialize into compact form, and replace the extra headers of msr with the result.

+

To remove all of the extra headers, set jsonstring to NULL.

+

This function cannot be used in combination with the routines that use a parsed state, i.e. mseh_get_ptr_r() and mseh_set_ptr_r().

+
Parameters
+ + + +
[in]msrMS3Record to generate extra headers for
[in]jsonstringJSON replacment for extra headers of msr
+
+
+
Returns
Length of extra headers on success, otherwise a (negative) libmseed error code
+ +
+
+ +

◆ mseh_print()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
int mseh_print (const MS3Record * msr,
int indent )
+
+extern
+
+ +

Print the extra header structure for the specified MS3Record.

+

Output is printed in a pretty, formatted form for readability and the anonymous, root object container (the outer {}) is not printed.

+
Parameters
+ + + +
[in]msrMS3Record with extra headers to pring
[in]indentNumber of spaces to indent output
+
+
+
Returns
0 on success and a (negative) libmseed error code on error.
+ +
+
+
+ + + + + diff --git a/group__io-functions.html b/group__io-functions.html new file mode 100644 index 0000000..634d4fc --- /dev/null +++ b/group__io-functions.html @@ -0,0 +1,1028 @@ + + + + + + + +libmseed: File and URL I/O + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
File and URL I/O
+
+
+ +

Reading and writing interfaces for miniSEED to/from files or URLs. +More...

+ + + + + + + + +

+Data Structures

struct  LMIO
 Type definition for data source I/O: file-system versus URL. More...
 
struct  MS3FileParam
 State container for reading miniSEED records from files or URLs. More...
 
+ + + + + + + +

+Macros

#define LMIO_INITIALIZER
 Initialializer for the internal stream handle LMIO.
 
#define MS3FileParam_INITIALIZER
 Initialializer for the internal file or URL I/O parameters MS3FileParam.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

int ms3_readmsr (MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose)
 Read miniSEED records from a file or URL.
 
int ms3_readmsr_r (MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose)
 Read miniSEED records from a file or URL in a thread-safe way.
 
int ms3_readmsr_selection (MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, const MS3Selections *selections, int8_t verbose)
 Read miniSEED records from a file or URL with optional selection.
 
int ms3_readtracelist (MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags, int8_t verbose)
 Read miniSEED from a file into a trace list.
 
int ms3_readtracelist_timewin (MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, nstime_t starttime, nstime_t endtime, int8_t splitversion, uint32_t flags, int8_t verbose)
 Read miniSEED from a file into a trace list, with time range selection.
 
int ms3_readtracelist_selection (MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t splitversion, uint32_t flags, int8_t verbose)
 Read miniSEED from a file into a trace list, with selection filtering.
 
int ms3_url_useragent (const char *program, const char *version)
 Set User-Agent header for URL-based requests.
 
int ms3_url_userpassword (const char *userpassword)
 Set authentication credentials for URL-based requests.
 
int ms3_url_addheader (const char *header)
 Add header to any URL-based requests.
 
void ms3_url_freeheaders (void)
 Free all set headers for URL-based requests.
 
int64_t msr3_writemseed (MS3Record *msr, const char *mspath, int8_t overwrite, uint32_t flags, int8_t verbose)
 Write miniSEED from an MS3Record container to a file.
 
int64_t mstl3_writemseed (MS3TraceList *mst, const char *mspath, int8_t overwrite, int maxreclen, int8_t encoding, uint32_t flags, int8_t verbose)
 Write miniSEED from an MS3TraceList container to a file.
 
int libmseed_url_support (void)
 Run-time test for URL support in libmseed.
 
MS3FileParamms3_mstl_init_fd (int fd)
 Initialize MS3FileParam parameters for a file descriptor.
 
+

Detailed Description

+

Reading and writing interfaces for miniSEED to/from files or URLs.

+

The miniSEED reading interfaces read from either regular files or URLs (if optional support is included). The miniSEED writing interfaces write to regular files.

+

URL support for reading is included by building the library with the LIBMSEED_URL variable defined, see the INSTALL instructions for more information. Only URL path-specified resources can be read, e.g. HTTP GET requests. More advanced POST or form-based requests are not supported.

+

The function libmseed_url_support() can be used as a run-time test to determine if URL support is included in the library.

+

Some parameters can be set that affect the reading of data from URLs, including:

+

Diagnostics: Setting environment variable LIBMSEED_URL_DEBUG enables detailed verbosity of URL protocol exchanges.

+
See also
ms3_readmsr()
+
+ms3_readmsr_selection()
+
+ms3_readtracelist()
+
+ms3_readtracelist_selection()
+
+msr3_writemseed()
+
+mstl3_writemseed()
+

Data Structure Documentation

+ +

◆ MS3FileParam

+ +
+
+ + + + +
struct MS3FileParam
+
+

State container for reading miniSEED records from files or URLs.

+

In general these values should not be directly set or accessed. It is possible to allocate a structure and set the path, startoffset, and endoffset values for advanced usage. Note that file/URL start and end offsets can also be parsed from the path name as well.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Fields
+char +path[512] +INPUT: File name or URL.
+int64_t +startoffset +INPUT: Start position in input stream.
+int64_t +endoffset +INPUT: End position in input stream, 0 == unknown (e.g. pipe)
+int64_t +streampos +OUTPUT: Read position of input stream.
+int64_t +recordcount +OUTPUT: Count of records read from this stream/file so far.
+char * +readbuffer +INTERNAL: Read buffer, allocated internally.
+int +readlength +INTERNAL: Length of data in read buffer.
+int +readoffset +INTERNAL: Read offset in read buffer.
+uint32_t +flags +INTERNAL: Stream reading state flags.
+LMIO +input +INTERNAL: IO handle, file or URL.
+ +
+
+

Macro Definition Documentation

+ +

◆ LMIO_INITIALIZER

+ +
+
+ + + + +
#define LMIO_INITIALIZER
+
+Value:
{ \
+
.type = LMIO_NULL, .handle = NULL, .handle2 = NULL, .still_running = 0 \
+
}
+
+

Initialializer for the internal stream handle LMIO.

+ +
+
+ +

◆ MS3FileParam_INITIALIZER

+ +
+
+ + + + +
#define MS3FileParam_INITIALIZER
+
+Value:
{ \
+
.path = "", .startoffset = 0, .endoffset = 0, .streampos = 0, \
+
.recordcount = 0, .readbuffer = NULL, .readlength = 0, \
+
.readoffset = 0, .flags = 0, .input = LMIO_INITIALIZER \
+
}
+
#define LMIO_INITIALIZER
Initialializer for the internal stream handle LMIO.
Definition libmseed.h:705
+
+

Initialializer for the internal file or URL I/O parameters MS3FileParam.

+ +
+
+

Function Documentation

+ +

◆ ms3_readmsr()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int ms3_readmsr (MS3Record ** ppmsr,
const char * mspath,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Read miniSEED records from a file or URL.

+

This routine is a wrapper for ms3_readmsr_selection() that uses the global file reading parameters. This routine is not thread safe and cannot be used to read more than one stream at a time.

+

See ms3_readmsr_selection() for a further description of arguments.

+
Returns
Return value from ms3_readmsr_selection()
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_readmsr_r()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms3_readmsr_r (MS3FileParam ** ppmsfp,
MS3Record ** ppmsr,
const char * mspath,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Read miniSEED records from a file or URL in a thread-safe way.

+

This routine is a wrapper for ms3_readmsr_selection() that uses the re-entrant capabilities. This routine is thread safe and can be used to read more than one stream at a time as long as separate MS3FileParam containers are used for each stream.

+

A MS3FileParam container will be allocated if *ppmsfp is NULL.

+

See ms3_readmsr_selection() for a further description of arguments.

+
Returns
Return value from ms3_readmsr_selection()
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_readmsr_selection()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms3_readmsr_selection (MS3FileParam ** ppmsfp,
MS3Record ** ppmsr,
const char * mspath,
uint32_t flags,
const MS3Selections * selections,
int8_t verbose )
+
+extern
+
+ +

Read miniSEED records from a file or URL with optional selection.

+

This routine will open and read, with subsequent calls, all miniSEED records in specified stream (file or URL).

+

All stream reading parameters are stored in a MS3FileParam container and returned (via a pointer to a pointer) for the calling routine to use in subsequent calls. A MS3FileParam container will be allocated if *ppmsfp is NULL. This routine is thread safe and can be used to read multiple streams in parallel as long as the stream reading parameters are managed appropriately.

+

The flags argument are bit flags used to control the reading process. The following flags are supported:

+

If MSF_PNAMERANGE is set in flags, the mspath will be searched for start and end byte offsets for the file or URL in the following format: 'PATH@START-END', where START and END are both optional and specified in bytes.

+

If selections is not NULL, the MS3Selections will be used to limit what is returned to the caller. Any data not matching the selections will be skipped.

+

After reading all the records in a stream the calling program should call this routine a final time with mspath set to NULL. This will close the input stream and free allocated memory.

+
Parameters
+ + + + + + + +
[out]ppmsfpPointer-to-pointer of an MS3FileParam, which contains the state of stream reading across iterative calls of this function.
[out]ppmsrPointer-to-pointer of an MS3Record, which will contain a parsed record on success.
[in]mspathFile or URL to read
[in]flagsFlags used to control parsing, see Control flags
[in]selectionsSpecify limits to which data should be returned, see Data Selections
[in]verboseControls verbosity, 0 means no diagnostic output
+
+
+
Returns
MS_NOERROR and populates an MS3Record struct, at *ppmsr, on successful read. On error, a (negative) libmseed error code is returned and *ppmsr is set to NULL.
+
Return values
+ + +
MS_ENDOFFILEon reaching the end of a stream
+
+
+
See also
Data Selections
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_readtracelist()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms3_readtracelist (MS3TraceList ** ppmstl,
const char * mspath,
const MS3Tolerance * tolerance,
int8_t splitversion,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Read miniSEED from a file into a trace list.

+

This is a simple wrapper for ms3_readtracelist_selection() that uses no selections.

+

See ms3_readtracelist_selection() for a further description of arguments.

+
Returns
Return value from ms3_readtracelist_selection()
+

MessageOnError - this function logs a message on error

+
See also
Trace List
+ +
+
+ +

◆ ms3_readtracelist_timewin()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms3_readtracelist_timewin (MS3TraceList ** ppmstl,
const char * mspath,
const MS3Tolerance * tolerance,
nstime_t starttime,
nstime_t endtime,
int8_t splitversion,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Read miniSEED from a file into a trace list, with time range selection.

+

This is a wrapper for ms3_readtraces_selection() that creates a simple selection for a specified time window.

+

See ms3_readtracelist_selection() for a further description of arguments.

+
Returns
Return value from ms3_readtracelist_selection()
+

MessageOnError - this function logs a message on error

+
See also
Trace List
+ +
+
+ +

◆ ms3_readtracelist_selection()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms3_readtracelist_selection (MS3TraceList ** ppmstl,
const char * mspath,
const MS3Tolerance * tolerance,
const MS3Selections * selections,
int8_t splitversion,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Read miniSEED from a file into a trace list, with selection filtering.

+

This routine will open and read all miniSEED records in specified file and populate a MS3TraceList, allocating this struture if needed. This routine is thread safe.

+

If selections is not NULL, the MS3Selections will be used to limit which records are added to the trace list. Any data not matching the selections will be skipped.

+

As this routine reads miniSEED records it attempts to construct continuous time series, merging segments when possible. See mstl3_addmsr() for details of tolerance.

+

The splitversion flag controls whether data are grouped according to data publication version (or quality for miniSEED 2.x). See mstl3_addmsr() for full details.

+

If the MSF_RECORDLIST flag is set in flags, a MS3RecordList will be built for each MS3TraceSeg. The MS3RecordPtr entries contain the location of the data record, bit flags, extra headers, etc.

+
Parameters
+ + + + + + + + +
[out]ppmstlPointer-to-pointer to a MS3TraceList to populate
[in]mspathFile to read
[in]toleranceTolerance function pointers as MS3Tolerance
[in]selectionsPointer to MS3Selections for limiting data
[in]splitversionFlag to control splitting of version/quality
[in]flagsFlags to control reading, see ms3_readmsr_selection()
[in]verboseControls verbosity, 0 means no diagnostic output
+
+
+
Returns
MS_NOERROR and populates an MS3TraceList struct at *ppmstl on success, otherwise returns a (negative) libmseed error code.
+

MessageOnError - this function logs a message on error

+
See also
Trace List
+
+Data Selections
+ +
+
+ +

◆ ms3_url_useragent()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
int ms3_url_useragent (const char * program,
const char * version )
+
+extern
+
+ +

Set User-Agent header for URL-based requests.

+

Configure global User-Agent header for URL-based requests generated by the library. The program and version values will be combined into the form "program/version" along with declarations of the library and URL-supporting dependency versions.

+

An error will be returned when the library was not compiled with URL support.

+
Parameters
+ + + +
[in]programName of calling program
[in]versionVersion of calling program
+
+
+
Returns
0 on succes and a negative library error code on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_url_userpassword()

+ +
+
+ + + + + +
+ + + + + + + +
int ms3_url_userpassword (const char * userpassword)
+
+extern
+
+ +

Set authentication credentials for URL-based requests.

+

Sets global user and password for authentication for URL-based requests generated by the library. The expected format of the credentials is: "[user name]:[password]" (without the square brackets).

+

An error will be returned when the library was not compiled with URL support.

+
Parameters
+ + +
[in]userpasswordUser and password as user:password
+
+
+
Returns
0 on succes and a negative library error code on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_url_addheader()

+ +
+
+ + + + + +
+ + + + + + + +
int ms3_url_addheader (const char * header)
+
+extern
+
+ +

Add header to any URL-based requests.

+

Sets global header to be included in URL-based requests generated by the library.

+

An error will be returned when the library was not compiled with URL support.

+
See also
ms3_url_freeheaders()
+
Parameters
+ + +
[in]headerHeader in "key: value" format
+
+
+
Returns
0 on succes and a negative library error code on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms3_url_freeheaders()

+ +
+
+ + + + + +
+ + + + + + + +
void ms3_url_freeheaders (void )
+
+extern
+
+ +

Free all set headers for URL-based requests.

+

Free all global headers for URL-based requests as set by ms3_url_addheader().

+
See also
ms3_url_addheader()
+ +
+
+ +

◆ msr3_writemseed()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
int64_t msr3_writemseed (MS3Record * msr,
const char * mspath,
int8_t overwrite,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Write miniSEED from an MS3Record container to a file.

+

Pack MS3Record data into miniSEED record(s) by calling msr3_pack() and write to a specified file. The MS3Record container is used as a template for record(s) written to the file.

+

The overwrite flag controls whether a existing file is overwritten or not. If true (non-zero) any existing file will be replaced. If false (zero) new records will be appended to an existing file. In either case, new files will be created if they do not yet exist.

+
Parameters
+ + + + + + +
[in,out]msrMS3Record containing data to write
[in]mspathFile for output records
[in]overwriteFlag to control overwriting versus appending
[in]flagsFlags controlling data packing, see msr3_pack()
[in]verboseControls verbosity, 0 means no diagnostic output
+
+
+
Returns
the number of records written on success and -1 on error.
+

MessageOnError - this function logs a message on error

+
See also
msr3_pack()
+ +
+
+ +

◆ mstl3_writemseed()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int64_t mstl3_writemseed (MS3TraceList * mstl,
const char * mspath,
int8_t overwrite,
int maxreclen,
int8_t encoding,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Write miniSEED from an MS3TraceList container to a file.

+

Pack MS3TraceList data into miniSEED record(s) by calling mstl3_pack() and write to a specified file.

+

The overwrite flag controls whether a existing file is overwritten or not. If true (non-zero) any existing file will be replaced. If false (zero) new records will be appended to an existing file. In either case, new files will be created if they do not yet exist.

+
Parameters
+ + + + + + + + +
[in,out]mstlMS3TraceList containing data to write
[in]mspathFile for output records
[in]overwriteFlag to control overwriting versus appending
[in]maxreclenThe maximum record length to create
[in]encodingencoding Encoding for data samples, see msr3_pack()
[in]flagsFlags controlling data packing, see mstl3_pack() and msr3_pack()
[in]verboseControls verbosity, 0 means no diagnostic output
+
+
+
Returns
the number of records written on success and -1 on error.
+

MessageOnError - this function logs a message on error

+
See also
mstl3_pack()
+
+msr3_pack()
+ +
+
+ +

◆ libmseed_url_support()

+ +
+
+ + + + + +
+ + + + + + + +
int libmseed_url_support (void )
+
+extern
+
+ +

Run-time test for URL support in libmseed.

+
Returns
0 when no URL suported is included, non-zero otherwise.
+ +
+
+ +

◆ ms3_mstl_init_fd()

+ +
+
+ + + + + +
+ + + + + + + +
MS3FileParam * ms3_mstl_init_fd (int fd)
+
+extern
+
+ +

Initialize MS3FileParam parameters for a file descriptor.

+

Initialize a MS3FileParam for reading from a specified fd (file descriptor).

+

The MS3FileParam should be used with ms3_readmsr_r() or ms3_readmsr_selection(). Once all data has been read from the stream, it will be closed during the cleanup call of those routines.

+
Parameters
+ + +
[in]fdFile descriptor for input reading
+
+
+
Returns
Allocated MS3FileParam on success and NULL on error.
+

MessageOnError - this function logs a message on error

+ +
+
+
+ + + + + diff --git a/group__leapsecond.html b/group__leapsecond.html new file mode 100644 index 0000000..eab741e --- /dev/null +++ b/group__leapsecond.html @@ -0,0 +1,269 @@ + + + + + + + +libmseed: Leap Second Handling + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Leap Second Handling
+
+
+ +

Utilities for handling leap seconds. +More...

+ + + + + +

+Data Structures

struct  LeapSecond
 Leap second list container. More...
 
+ + + + + + + +

+Functions

int ms_readleapseconds (const char *envvarname)
 Read leap second file specified by an environment variable.
 
int ms_readleapsecondfile (const char *filename)
 Read leap second from the specified file.
 
+ + + +

+Variables

LeapSecondleapsecondlist
 
+

Detailed Description

+

Utilities for handling leap seconds.

+
Note
The library contains an embedded list of leap seconds through year 2023. These functions are only needed if leap seconds are added in 2024 and beyond.
+

The library contains functionality to load a list of leap seconds into a global list, which is then used to determine when leap seconds occurred, ignoring any flags in the data itself regarding leap seconds. This is useful as past leap seconds are well known and leap second indicators in data are, historically, more often wrong than otherwise.

+

The library uses the leap second list (and any flags in the data, if no list is provided) to adjust the calculated time of the last sample in a record. This allows proper merging of continuous series generated through leap seconds.

+

Normally, calling programs do not need to do any particular handling of leap seconds after loading the leap second list.

+
Note
The library's internal, epoch-based time representation cannot distinguish a leap second. On the epoch time scale a leap second appears as repeat of the second that follows it, an apparent duplicated second. Since the library does not know if this value is a leap second or not, when converted to a time string, the non-leap second representation is used, i.e. no second values of "60" are generated.
+

Data Structure Documentation

+ +

◆ LeapSecond

+ +
+
+ + + + +
struct LeapSecond
+
+

Leap second list container.

+
+ + + + + + + + + + +
Data Fields
+nstime_t +leapsecond +Time of leap second as epoch since 1 January 1900.
+int32_t +TAIdelta +TAI-UTC difference in seconds.
+struct LeapSecond * +next +Pointer to next entry, NULL if the last.
+ +
+
+

Function Documentation

+ +

◆ ms_readleapseconds()

+ +
+
+ + + + + +
+ + + + + + + +
int ms_readleapseconds (const char * envvarname)
+
+extern
+
+ +

Read leap second file specified by an environment variable.

+

Leap seconds are loaded into the library's global leapsecond list.

+
Parameters
+ + +
[in]envvarnameEnvironment variable that identifies the leap second file
+
+
+
Returns
positive number of leap seconds read
+
Return values
+ + + +
-1on file read error
-2when the environment variable is not set
+
+
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_readleapsecondfile()

+ +
+
+ + + + + +
+ + + + + + + +
int ms_readleapsecondfile (const char * filename)
+
+extern
+
+ +

Read leap second from the specified file.

+

Leap seconds are loaded into the library's global leapsecond list.

+

The file is expected to be in NTP leap second list format. Some locations where this file can be obtained are indicated in RFC 8633 section 3.7: https://www.rfc-editor.org/rfc/rfc8633.html#section-3.7

+
Parameters
+ + +
[in]filenameFile containing leap second list
+
+
+
Returns
positive number of leap seconds read on success
+
Return values
+ + +
-1on error
+
+
+

MessageOnError - this function logs a message on error

+ +
+
+

Variable Documentation

+ +

◆ leapsecondlist

+ +
+
+ + + + + +
+ + + + +
LeapSecond* leapsecondlist
+
+extern
+
+

Global leap second list

+ +
+
+
+ + + + + diff --git a/group__logging.html b/group__logging.html new file mode 100644 index 0000000..c050ec6 --- /dev/null +++ b/group__logging.html @@ -0,0 +1,660 @@ + + + + + + + +libmseed: Central Logging + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Central Logging
+
+
+ +

Central logging functions for the library and calling programs. +More...

+ + + + + + + + + + + +

+Data Structures

struct  MSLogEntry
 Log registry entry. More...
 
struct  MSLogRegistry
 Log message registry. More...
 
struct  MSLogParam
 Logging parameters. Callers should not modify these values directly and generally should not need to access them. More...
 
+ + + + + + + + + + + + + + + + + + + + + +

+Macros

#define MAX_LOG_MSG_LENGTH   200
 
#define MSLogRegistry_INITIALIZER
 Initialializer for MSLogRegistry.
 
#define MSLogParam_INITIALIZER
 Initialializer for MSLogParam.
 
+#define ms_log(level, ...)    ms_rlog(__func__, level, __VA_ARGS__)
 Wrapper for ms_rlog(), call as ms_log (level, format, ...)
 
+#define ms_log_l(logp, level, ...)    ms_rlog_l(logp, __func__, level, __VA_ARGS__)
 Wrapper for ms_rlog_l(), call as ms_log_l (logp, level, format, ...)
 
+#define ms_loginit(log_print, logprefix, diag_print, errprefix)    ms_rloginit(log_print, logprefix, diag_print, errprefix, 0)
 Convenience wrapper for ms_rloginit(), omitting max messages, disabling registry.
 
+#define ms_loginit_l(logp, log_print, logprefix, diag_print, errprefix)    ms_rloginit_l(logp, log_print, logprefix, diag_print, errprefix, 0)
 Convenience wrapper for ms_rloginit_l(), omitting max messages, disabling registry.
 
+ + + + + + + + + + + + + + + + + + + +

+Functions

int ms_rlog (const char *function, int level, const char *format,...)
 Register log message using global logging parameters.
 
int ms_rlog_l (MSLogParam *logp, const char *function, int level, const char *format,...)
 Register log message using specified logging parameters.
 
void ms_rloginit (void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages)
 Initialize the global logging parameters.
 
MSLogParamms_rloginit_l (MSLogParam *logp, void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages)
 Initialize specified MSLogParam logging parameters.
 
int ms_rlog_emit (MSLogParam *logp, int count, int context)
 Emit, aka send to print functions, messages from log registry.
 
int ms_rlog_free (MSLogParam *logp)
 Free, without emitting, all messages from log registry.
 
+

Detailed Description

+

Central logging functions for the library and calling programs.

+

This central logging facility is used for all logging performed by the library. Calling programs may also wish to log messages via the same facility for consistency.

+

The logging can be configured to send messages to arbitrary functions, referred to as log_print() and diag_print(). This allows output to be re-directed to other logging systems if needed.

+

It is also possible to assign prefixes to log messages for identification, referred to as logprefix and errprefix.

+

Logging levels

+

Three message levels are recognized:

    +
  • 0 : Normal log messages, printed using log_print() with logprefix
  • +
  • 1 : Diagnostic messages, printed using diag_print() with logprefix
  • +
  • 2+ : Error messages, printed using diag_print() with errprefix
  • +
+

It is the task of the ms_rlog() and ms_rlog_l() functions to format a message using printf conventions and pass the formatted string to the appropriate printing function. The convenience macros ms_log() and ms_log_l() can be used to automatically set the calling function name.

+

Log Registry

+

The log registry facility allows a calling program to disable error (and warning) output from the library and either inspect it or emit (print) as desired.

+

By default log messages are sent directly to the printing functions. Optionally, error and warning messages (levels 1 and 2) can be accumulated in a log-registry. Verbose output messages (level 0) are not accumulated in the registry. The registry is enabled by setting the maxmessages argument of either ms_rloginit() or ms_rloginit_l(). Messages can be emitted, aka printed, using ms_rlog_emit() and cleared using ms_rlog_free(). Alternatively, the MSLogRegistry associated with a MSLogParam (or the global parameters at gMSLogParam).

+

See Read miniSEED from files for a simple example of error and warning message registry usage.

+

Logging in Threads

+

By default the library is compiled in a mode where each thread of a multi-threaded program will have it's own, default logging parameters. If you wish to change the default printing functions, message prefixes, or enable the log registry, this must be done per-thread.

+

The library can be built with the LIBMSEED_NO_THREADING variable defined, resulting in a mode where there are global parameters for all threads. In general this should not be used unless the system does not support the necessary thread-local storage directives.

+

Message on Error

+

Functions marked as MessageOnError log a message when returning an error status or logging a warning (log levels 1 and 2). This indication can be useful when error and warning messages are retained in log-registry.

+

Data Structure Documentation

+ +

◆ MSLogEntry

+ +
+
+ + + + +
struct MSLogEntry
+
+

Log registry entry.

+
See also
ms_rlog()
+
+ms_rlog_l()
+
+ + + + + + + + + + + + + +
Data Fields
+int +level +Message level.
+char +function[30] +Function generating the message.
+char +message[MAX_LOG_MSG_LENGTH] +Log, warning or error message.
+struct MSLogEntry * +next +
+ +
+
+ +

◆ MSLogRegistry

+ +
+
+ + + + +
struct MSLogRegistry
+
+

Log message registry.

+
See also
ms_rlog()
+
+ms_rlog_l()
+
+ + + + + + + + + + +
Data Fields
+int +maxmessages +
+int +messagecnt +
+MSLogEntry * +messages +
+ +
+
+

Macro Definition Documentation

+ +

◆ MAX_LOG_MSG_LENGTH

+ +
+
+ + + + +
#define MAX_LOG_MSG_LENGTH   200
+
+

Maximum length of log messages in bytes

+ +
+
+ +

◆ MSLogRegistry_INITIALIZER

+ +
+
+ + + + +
#define MSLogRegistry_INITIALIZER
+
+Value:
{ \
+
.maxmessages = 0, .messagecnt = 0, .messages = NULL \
+
}
+
+

Initialializer for MSLogRegistry.

+ +
+
+ +

◆ MSLogParam_INITIALIZER

+ +
+
+ + + + +
#define MSLogParam_INITIALIZER
+
+Value:
{ \
+
.log_print = NULL, .logprefix = NULL, \
+
.diag_print = NULL, .errprefix = NULL, \
+ +
}
+
#define MSLogRegistry_INITIALIZER
Initialializer for MSLogRegistry.
Definition libmseed.h:1129
+
+

Initialializer for MSLogParam.

+ +
+
+

Function Documentation

+ +

◆ ms_rlog()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int ms_rlog (const char * function,
int level,
const char * format,
... )
+
+extern
+
+ +

Register log message using global logging parameters.

+

It is convenient to call this function via the ms_log() macro, which sets the calling function automatically.

+

Three message levels are recognized, see logging-levels for more information.

+

This function builds the log/error message and passes to it to the appropriate print function. If custom printing functions have not been defined, messages will be printed with fprintf(), log messages to stdout and error messages to stderr.

+

If the log/error prefixes have been set they will be pre-pended to the message. If no custom log prefix is set none will be included. If no custom error prefix is set "Error: " will be included.

+

A trailing newline character is for error messages is removed if the message is added to the log registry.

+

All messages will be truncated at the MAX_LOG_MSG_LENGTH, this includes any prefix.

+
Parameters
+ + + + + +
[in]functionName of function registering log message
[in]levelMessage level
[in]formatMessage format in printf() style
[in]...Message format variables
+
+
+
Returns
The number of characters formatted on success, and a negative value on error..
+ +
+
+ +

◆ ms_rlog_l()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms_rlog_l (MSLogParam * logp,
const char * function,
int level,
const char * format,
... )
+
+extern
+
+ +

Register log message using specified logging parameters.

+

It is convenient to call this function via the ms_log_l() macro, which sets the calling function automatically.

+

The function uses logging parameters specified in the supplied MSLogParam. This reentrant capability allows using different parameters in different parts of a program or different threads.

+

Three message levels are recognized, see logging-levels for more information.

+

This function builds the log/error message and passes to it to the appropriate print function. If custom printing functions have not been defined, messages will be printed with fprintf(), log messages to stdout and error messages to stderr.

+

If the log/error prefixes have been set they will be pre-pended to the message. If no custom log prefix is set none will be included. If no custom error prefix is set "Error: " will be included.

+

A trailing newline character is for error messages is removed if the message is added to the log registry.

+

All messages will be truncated at the MAX_LOG_MSG_LENGTH, this includes any prefix.

+
Parameters
+ + + + + + +
[in]logpPointer to MSLogParam to use for this message
[in]functionName of function registering log message
[in]levelMessage level
[in]formatMessage format in printf() style
[in]...Message format variables
+
+
+
Returns
The number of characters formatted on success, and a negative value on error.
+ +
+
+ +

◆ ms_rloginit()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
void ms_rloginit (void(*)(const char *) log_print,
const char * logprefix,
void(*)(const char *) diag_print,
const char * errprefix,
int maxmessages )
+
+extern
+
+ +

Initialize the global logging parameters.

+

Any message printing functions indicated must except a single argument, namely a string (const char *) that will contain the log message. If the function pointers are NULL, defaults will be used.

+

If the log and error prefixes have been set they will be pre-pended to the message. If the prefixes are NULL, defaults will be used.

+

If maxmessages is greater than zero, warning and error (level >= 1) messages will be accumulated in a message registry. Once the maximum number of messages have accumulated, the oldest messages are discarded. Messages in the registry can be printed using ms_rlog_emit() or cleared using ms_rlog_free().

+
Parameters
+ + + + + + +
[in]log_printFunction to print log messages
[in]logprefixPrefix to add to log and diagnostic messages
[in]diag_printFunction to print diagnostic and error messages
[in]errprefixPrefix to add to error messages
[in]maxmessagesMaximum number of error/warning messages to store in registry
+
+
+
See also
ms_rlog()
+
+ms_rlog_emit()
+
+ms_rlog_free()
+ +
+
+ +

◆ ms_rloginit_l()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MSLogParam * ms_rloginit_l (MSLogParam * logp,
void(*)(const char *) log_print,
const char * logprefix,
void(*)(const char *) diag_print,
const char * errprefix,
int maxmessages )
+
+extern
+
+ +

Initialize specified MSLogParam logging parameters.

+

If the logging parameters have not been initialized (logp == NULL), new parameter space will be allocated.

+

Any message printing functions indicated must except a single argument, namely a string (const char *) that will contain the log message. If the function pointers are NULL, defaults will be used.

+

If the log and error prefixes have been set they will be pre-pended to the message. If the prefixes are NULL, defaults will be used.

+

If maxmessages is greater than zero, warning and error (level >= 1) messages will be accumulated in a message registry. Once the maximum number of messages have accumulated, the oldest messages are discarded. Messages in the registry can be printed using ms_rlog_emit() or cleared using ms_rlog_free().

+
Parameters
+ + + + + + + +
[in]logpMSLogParam logging parameters
[in]log_printFunction to print log messages
[in]logprefixPrefix to add to log and diagnostic messages
[in]diag_printFunction to print diagnostic and error messages
[in]errprefixPrefix to add to error messages
[in]maxmessagesMaximum number of error/warning messages to store in registry
+
+
+
Returns
a pointer to the created/re-initialized MSLogParam struct on success and NULL on error.
+
See also
ms_rlog()
+
+ms_rlog_emit()
+
+ms_rlog_free()
+ +
+
+ +

◆ ms_rlog_emit()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int ms_rlog_emit (MSLogParam * logp,
int count,
int context )
+
+extern
+
+ +

Emit, aka send to print functions, messages from log registry.

+

Emit messages from the log registry, using the printing functions identified by the MSLogParam.

+

Messages are printed in order from earliest to latest.

+

The maximum number messages to emit, from most recent to earliest, can be limited using count. If the value is 0 all messages are emitted. If this limit is used and messages are left in the registry, it is highly recommended to either emit them soon or clear them with ms_rlog_free(). A common pattern would be to emit the last message (e.g. count of 1) and immediately free (discard) any remaining messages.

+
Parameters
+ + + + +
[in]logpMSLogParam for this message or NULL for global parameters
[in]countNumber of messages to emit, 0 to emit all messages
[in]contextIf non-zero include context by prefixing the function name (if available)
+
+
+
Returns
The number of message emitted on success, and a negative value on error.
+
See also
ms_rloginit()
+
+ms_rlog_free()
+ +
+
+ +

◆ ms_rlog_free()

+ +
+
+ + + + + +
+ + + + + + + +
int ms_rlog_free (MSLogParam * logp)
+
+extern
+
+ +

Free, without emitting, all messages from log registry.

+
Parameters
+ + +
[in]logpMSLogParam for this message or NULL for global parameters
+
+
+
Returns
The number of message freed on success, and a negative value on error.
+ +
+
+
+ + + + + diff --git a/group__low-level.html b/group__low-level.html new file mode 100644 index 0000000..7a40d1d --- /dev/null +++ b/group__low-level.html @@ -0,0 +1,112 @@ + + + + + + + +libmseed: Low level definitions + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Low level definitions
+
+
+ +

The low-down, the nitty gritty, the basics. +More...

+ + + + + + + + + + + + + + + + + +

+Topics

 Memory Allocators
 User-definable memory allocators used by library.
 
 Data Encodings
 Data encoding type defines.
 
 Byte swap flags
 Flags indicating whether the header or payload needed byte swapping.
 
 Return codes
 Common error codes returned by library functions. Error values will always be negative.
 
 Control flags
 Parsing, packing and trace construction control flags.
 
+

Detailed Description

+

The low-down, the nitty gritty, the basics.

+
+ + + + + diff --git a/group__memory-allocators.html b/group__memory-allocators.html new file mode 100644 index 0000000..3623349 --- /dev/null +++ b/group__memory-allocators.html @@ -0,0 +1,217 @@ + + + + + + + +libmseed: Memory Allocators + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ + +
+ +

User-definable memory allocators used by library. +More...

+ + + + +

+Data Structures

struct  LIBMSEED_MEMORY
 
+ + + +

+Functions

void * libmseed_memory_prealloc (void *ptr, size_t size, size_t *currentsize)
 
+ + + + + +

+Variables

LIBMSEED_MEMORY libmseed_memory
 
size_t libmseed_prealloc_block_size
 
+

Detailed Description

+

User-definable memory allocators used by library.

+

The global structure libmseed_memory contains three function pointers that are used for all memory allocation and freeing done by the library.

+

The following function pointers are available:

    +
  • libmseed_memory.malloc - requires a malloc()-like function
  • +
  • libmseed_memory.realloc - requires a realloc()-like function
  • +
  • libmseed_memory.free - requires a free()-like function
  • +
+

By default the system malloc(), realloc(), and free() are used. Equivalent to setting:

+
+ + +
LIBMSEED_MEMORY libmseed_memory
+
void *(* realloc)(void *, size_t)
Pointer to desired realloc()
Definition libmseed.h:1372
+
void(* free)(void *)
Pointer to desired free()
Definition libmseed.h:1373
+
void *(* malloc)(size_t)
Pointer to desired malloc()
Definition libmseed.h:1371
+

Function Documentation

+ +

◆ libmseed_memory_prealloc()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
void * libmseed_memory_prealloc (void * ptr,
size_t size,
size_t * currentsize )
+
+extern
+
+

Internal realloc() wrapper that allocates in libmseed_prealloc_block_size blocks

+

Preallocation is used by default on Windows and disabled otherwise.

+ +
+
+

Variable Documentation

+ +

◆ libmseed_memory

+ +
+
+ + + + + +
+ + + + +
LIBMSEED_MEMORY libmseed_memory
+
+extern
+
+

Global memory management function list

+ +
+
+ +

◆ libmseed_prealloc_block_size

+ +
+
+ + + + + +
+ + + + +
size_t libmseed_prealloc_block_size
+
+extern
+
+

Global pre-allocation block size.

+

When non-zero, memory re-allocations will be increased in blocks of this size. This is useful on platforms where the system realloc() is slow such as Windows.

+

Default on Windows is 1 MiB, otherwise disabled.

+

Set to 0 to disable pre-allocation.

+
See also
msr3_resize_buffer
+
+mstl3_resize_buffers
+ +
+
+
+ + + + + diff --git a/group__miniseed-record.html b/group__miniseed-record.html new file mode 100644 index 0000000..73c6ea7 --- /dev/null +++ b/group__miniseed-record.html @@ -0,0 +1,1261 @@ + + + + + + + +libmseed: Record Handling + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Record Handling
+
+
+ +

Definitions and functions related to individual miniSEED records. +More...

+ + + + + +

+Data Structures

struct  MS3Record
 miniSEED record container More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

int msr3_parse (const char *record, uint64_t recbuflen, MS3Record **ppmsr, uint32_t flags, int8_t verbose)
 Parse miniSEED from a buffer.
 
int msr3_pack (const MS3Record *msr, void(*record_handler)(char *, int, void *), void *handlerdata, int64_t *packedsamples, uint32_t flags, int8_t verbose)
 Pack data into miniSEED records.
 
int msr3_repack_mseed3 (const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose)
 Repack a parsed miniSEED record into a version 3 record.
 
int msr3_pack_header3 (const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose)
 Pack a miniSEED version 3 header into the specified buffer.
 
int msr3_pack_header2 (const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose)
 Pack a miniSEED version 2 header into the specified buffer.
 
int64_t msr3_unpack_data (MS3Record *msr, int8_t verbose)
 Unpack data samples for a MS3Record.
 
int msr3_data_bounds (const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize)
 Determine the data payload bounds for a MS3Record.
 
int64_t ms_decode_data (const void *input, uint64_t inputsize, uint8_t encoding, uint64_t samplecount, void *output, uint64_t outputsize, char *sampletype, int8_t swapflag, const char *sid, int8_t verbose)
 Decode data samples to a supplied buffer.
 
MS3Recordmsr3_init (MS3Record *msr)
 Initialize and return an MS3Record.
 
void msr3_free (MS3Record **ppmsr)
 Free all memory associated with a MS3Record.
 
MS3Recordmsr3_duplicate (const MS3Record *msr, int8_t datadup)
 Duplicate a MS3Record.
 
nstime_t msr3_endtime (const MS3Record *msr)
 Calculate time of the last sample in a record.
 
void msr3_print (const MS3Record *msr, int8_t details)
 Print header values of an MS3Record.
 
int msr3_resize_buffer (MS3Record *msr)
 Resize data sample buffer of MS3Record to what is needed.
 
double msr3_sampratehz (const MS3Record *msr)
 Calculate sample rate in samples/second (Hertz) for a given MS3Record.
 
double msr3_host_latency (const MS3Record *msr)
 Calculate data latency based on the host time.
 
int64_t ms3_detect (const char *record, uint64_t recbuflen, uint8_t *formatversion)
 Detect miniSEED record in buffer.
 
int ms_parse_raw3 (const char *record, int maxreclen, int8_t details)
 Parse and verify a miniSEED 3.x record header.
 
int ms_parse_raw2 (const char *record, int maxreclen, int8_t details, int8_t swapflag)
 Parse and verify a miniSEED 2.x record header.
 
+

Detailed Description

+

Definitions and functions related to individual miniSEED records.

+

Data Structure Documentation

+ +

◆ MS3Record

+ +
+
+ + + + +
struct MS3Record
+
+

miniSEED record container

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Fields
+const char * +record +Raw miniSEED record, if available.
+int32_t +reclen +Length of miniSEED record in bytes.
+uint8_t +swapflag +Byte swap indicator (bitmask), see Byte swap flags.
+char +sid[LM_SIDLEN] +Source identifier as URN, max length LM_SIDLEN.
+uint8_t +formatversion +Format major version.
+uint8_t +flags +Record-level bit flags.
+nstime_t +starttime +Record start time (first sample)
+double +samprate +Nominal sample rate as samples/second (Hz) or period (s)
+int16_t +encoding +Data encoding format, see Data Encodings.
+uint8_t +pubversion +Publication version.
+int64_t +samplecnt +Number of samples in record.
+uint32_t +crc +CRC of entire record.
+uint16_t +extralength +Length of extra headers in bytes.
+uint32_t +datalength +Length of data payload in bytes.
+char * +extra +Pointer to extra headers.
+void * +datasamples +Data samples, numsamples of type sampletype.
+uint64_t +datasize +Size of datasamples buffer in bytes.
+int64_t +numsamples +Number of data samples in datasamples.
+char +sampletype +Sample type code: t, i, f, d Sample Types.
+ +
+
+

Function Documentation

+ +

◆ msr3_parse()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
int msr3_parse (const char * record,
uint64_t recbuflen,
MS3Record ** ppmsr,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Parse miniSEED from a buffer.

+

This routine will attempt to parse (detect and unpack) a miniSEED record from a specified memory buffer and populate a supplied MS3Record structure. Both miniSEED 2.x and 3.x records are supported.

+

The record length is automatically detected. For miniSEED 2.x this means the record must contain a 1000 blockette.

+
Parameters
+ + + + + + +
recordBuffer containing record to parse
recbuflenBuffer length in bytes
ppmsrPointer-to-point to a MS3Record that will be populated
flagsFlags controlling features: +
verbosecontrol verbosity of diagnostic output
+
+
+
Returns
Parsing status
+
Return values
+ + + + +
0Success, populates the supplied MS3Record.
>0Data record detected but not enough data is present, the return value is a hint of how many more bytes are needed.
<0library error code is returned.
+
+
+

MessageOnError - this function logs a message on error except MS_NOTSEED

+ +
+
+ +

◆ msr3_pack()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int msr3_pack (const MS3Record * msr,
void(*)(char *, int, void *) record_handler,
void * handlerdata,
int64_t * packedsamples,
uint32_t flags,
int8_t verbose )
+
+extern
+
+ +

Pack data into miniSEED records.

+

Packing is performed according to the version at MS3Record::formatversion.

+

The MS3Record::datasamples array and MS3Record::numsamples value will not be changed by this routine. It is the responsibility of the calling routine to adjust the data buffer if desired.

+

As each record is filled and finished they are passed to record_handler() which should expect 1) a char* to the record, 2) the length of the record and 3) a pointer supplied by the original caller containing optional private data (handlerdata). It is the responsibility of record_handler() to process the record, the memory will be re-used or freed when record_handler() returns.

+

The following data encodings and expected MS3Record::sampletype are supported:

    +
  • DE_TEXT (0), Text, expects type 't'
  • +
  • DE_INT16 (1), 16-bit integer, expects type 'i'
  • +
  • DE_INT32 (3), 32-bit integer, expects type 'i'
  • +
  • DE_FLOAT32 (4), 32-bit float (IEEE), expects type 'f'
  • +
  • DE_FLOAT64 (5), 64-bit float (IEEE), expects type 'd'
  • +
  • DE_STEIM1 (10), Stiem-1 compressed integers, expects type 'i'
  • +
  • DE_STEIM2 (11), Stiem-2 compressed integers, expects type 'i'
  • +
+

If flags has MSF_FLUSHDATA set, all of the data will be packed into data records even though the last one will probably be smaller than requested or, in the case of miniSEED 2, unfilled.

+

Default values are: record length = 4096, encoding = 11 (Steim2). The defaults are triggered when msr.reclen and msr.encoding are set to -1.

+
Parameters
+ + + + + + + +
[in]msrMS3Record containing data to pack
[in]record_handler()Callback function called for each record
[in]handlerdataA pointer that will be provided to the record_handler()
[out]packedsamplesThe number of samples packed, returned to caller
[in]flagsBit flags used to control the packing process: +
[in]verboseControls logging verbosity, 0 is no diagnostic output
+
+
+
Returns
the number of records created on success and -1 on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_repack_mseed3()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int msr3_repack_mseed3 (const MS3Record * msr,
char * record,
uint32_t recbuflen,
int8_t verbose )
+
+extern
+
+ +

Repack a parsed miniSEED record into a version 3 record.

+

Pack the parsed header into a version 3 header and copy the raw encoded data from the original record. The original record must be available at the MS3Record.record pointer.

+

This can be used to efficiently convert format versions or modify header values without unpacking the data samples.

+
Parameters
+ + + + + +
[in]msrMS3Record containing record to repack
[out]recordDestination buffer for repacked record
[in]recbuflenLength of destination buffer
[in]verboseControls logging verbosity, 0 is no diagnostic output
+
+
+
Returns
record length on success and -1 on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_pack_header3()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int msr3_pack_header3 (const MS3Record * msr,
char * record,
uint32_t recbuflen,
int8_t verbose )
+
+extern
+
+ +

Pack a miniSEED version 3 header into the specified buffer.

+

Default values are: record length = 4096, encoding = 11 (Steim2). The defaults are triggered when msr.reclen and msr.encoding are set to -1.

+
Parameters
+ + + + + +
[in]msrMS3Record to pack
[out]recordDestination for packed header
[in]recbuflenLength of destination buffer
[in]verboseControls logging verbosity, 0 is no diagnostic output
+
+
+
Returns
the size of the header (fixed and extra) on success, otherwise -1.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_pack_header2()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int msr3_pack_header2 (const MS3Record * msr,
char * record,
uint32_t recbuflen,
int8_t verbose )
+
+extern
+
+ +

Pack a miniSEED version 2 header into the specified buffer.

+

Default values are: record length = 4096, encoding = 11 (Steim2). The defaults are triggered when msr.reclen and msr.encoding are set to -1.

+
Parameters
+ + + + + +
[in]msrMS3Record to pack
[out]recordDestination for packed header
[in]recbuflenLength of destination buffer
[in]verboseControls logging verbosity, 0 is no diagnostic output
+
+
+
Returns
the size of the header (fixed and blockettes) on success, otherwise -1.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_unpack_data()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
int64_t msr3_unpack_data (MS3Record * msr,
int8_t verbose )
+
+extern
+
+ +

Unpack data samples for a MS3Record.

+

This routine can be used to unpack the data samples for a MS3Record that was earlier parsed without the data samples being decoded.

+

The packed/encoded data is accessed in the record indicated by MS3Record.record and the unpacked samples are placed in MS3Record.datasamples. The resulting data samples are either text characters, 32-bit integers, 32-bit floats or 64-bit floats in host byte order.

+

An internal buffer is allocated if the encoded data is not aligned for the sample size, which is a decent indicator of the alignment needed for decoding efficiently.

+
Parameters
+ + + +
[in]msrTarget MS3Record to unpack data samples
[in]verboseFlag to control verbosity, 0 means no diagnostic output
+
+
+
Returns
number of samples unpacked or negative libmseed error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_data_bounds()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int msr3_data_bounds (const MS3Record * msr,
uint32_t * dataoffset,
uint32_t * datasize )
+
+extern
+
+ +

Determine the data payload bounds for a MS3Record.

+

Bounds are the starting offset in record and size. For miniSEED 2.x the raw record is expected to be located at the MS3Record.record pointer.

+

When the encoding is a fixed length per sample (text, integers, or floats), calculate the data size based on the sample count and use if less than size determined otherwise.

+

When the encoding is Steim1 or Steim2, search for 64-byte padding frames (all zeros) at the end of the payload and remove from the reported size.

+
Parameters
+ + + + +
[in]msrThe MS3Record to determine payload bounds for
[out]dataoffsetOffset from start of record to start of payload
[out]datasizePayload size in bytes
+
+
+
Returns
0 on success or negative library error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_decode_data()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int64_t ms_decode_data (const void * input,
uint64_t inputsize,
uint8_t encoding,
uint64_t samplecount,
void * output,
uint64_t outputsize,
char * sampletype,
int8_t swapflag,
const char * sid,
int8_t verbose )
+
+extern
+
+ +

Decode data samples to a supplied buffer.

+
Parameters
+ + + + + + + + + + + +
[in]inputEncoded data
[in]inputsizeSize of input buffer in bytes
[in]encodingData encoding
[in]samplecountNumber of samples to decode
[out]outputDecoded data
[in]outputsizeSize of output buffer in bytes
[out]sampletypePointer to (single character) sample type of decoded data
[in]swapflagFlag indicating if encoded data needs swapping
[in]sidSource identifier to include in diagnostic/error messages
[in]verboseFlag to control verbosity, 0 means no diagnostic output
+
+
+
Returns
number of samples decoded or negative libmseed error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_init()

+ +
+
+ + + + + +
+ + + + + + + +
MS3Record * msr3_init (MS3Record * msr)
+
+extern
+
+ +

Initialize and return an MS3Record.

+

Memory is allocated if for a new MS3Record if msr is NULL.

+

If memory for the datasamples field has been allocated the pointer will be retained for reuse. If memory for extra headers has been allocated it will be released.

+
Parameters
+ + +
[in]msrA MS3Record to re-initialize
+
+
+
Returns
a pointer to a MS3Record struct on success or NULL on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_free()

+ +
+
+ + + + + +
+ + + + + + + +
void msr3_free (MS3Record ** ppmsr)
+
+extern
+
+ +

Free all memory associated with a MS3Record.

+

Free all memory associated with a MS3Record, including extra header and data samples if present.

+
Parameters
+ + +
[in]ppmsrPointer to point of the MS3Record to free
+
+
+ +
+
+ +

◆ msr3_duplicate()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
MS3Record * msr3_duplicate (const MS3Record * msr,
int8_t datadup )
+
+extern
+
+ +

Duplicate a MS3Record.

+

Extra headers are duplicated as well.

+

If the datadup flag is true (non-zero) and the source MS3Record has associated data samples copy them as well.

+
Parameters
+ + + +
[in]msrMS3Record to duplicate
[in]datadupFlag to control duplication of data samples
+
+
+
Returns
Pointer to a new MS3Record on success and NULL on error
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_endtime()

+ +
+
+ + + + + +
+ + + + + + + +
nstime_t msr3_endtime (const MS3Record * msr)
+
+extern
+
+ +

Calculate time of the last sample in a record.

+

If leap seconds have been loaded into the internal library list: when a record completely contains a leap second, starts before and ends after, the calculated end time will be adjusted (reduced) by one second.

Note
On the epoch time scale the value of a leap second is the same as the second following the leap second, without external information the values are ambiguous.
+
See also
ms_readleapsecondfile()
+
Parameters
+ + +
[in]msrMS3Record to calculate end time of
+
+
+
Returns
Time of the last sample on success and NSTERROR on error.
+ +
+
+ +

◆ msr3_print()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void msr3_print (const MS3Record * msr,
int8_t details )
+
+extern
+
+ +

Print header values of an MS3Record.

+
Parameters
+ + + +
[in]msrMS3Record to print
[in]detailsFlags to control the level of details:
    +
  • 0 - print a single summary line
  • +
  • 1 - print most details of header
  • +
  • >1 - print all details of header and extra headers if present
  • +
+
+
+
+ +
+
+ +

◆ msr3_resize_buffer()

+ +
+
+ + + + + +
+ + + + + + + +
int msr3_resize_buffer (MS3Record * msr)
+
+extern
+
+ +

Resize data sample buffer of MS3Record to what is needed.

+

This routine should only be used if pre-allocation of memory, via libmseed_prealloc_block_size, was enabled to allocate the buffer.

+
Parameters
+ + +
[in]msrMS3Record to resize buffer
+
+
+
Returns
Return 0 on success, otherwise returns a libmseed error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ msr3_sampratehz()

+ +
+
+ + + + + +
+ + + + + + + +
double msr3_sampratehz (const MS3Record * msr)
+
+externinline
+
+ +

Calculate sample rate in samples/second (Hertz) for a given MS3Record.

+
Parameters
+ + +
[in]msrMS3Record to calculate sample rate for
+
+
+
Returns
Return sample rate in Hertz (samples per second)
+ +
+
+ +

◆ msr3_host_latency()

+ +
+
+ + + + + +
+ + + + + + + +
double msr3_host_latency (const MS3Record * msr)
+
+extern
+
+ +

Calculate data latency based on the host time.

+

Calculation is based on the time of the last sample in the record; in other words, the difference between the host time and the time of the last sample in the record.

+

Double precision is returned, but the true precision is dependent on the accuracy of the host system clock among other things.

+
Parameters
+ + +
[in]msrMS3Record to calculate latency for
+
+
+
Returns
seconds of latency or 0.0 on error (indistinguishable from 0.0 latency).
+ +
+
+ +

◆ ms3_detect()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int64_t ms3_detect (const char * record,
uint64_t recbuflen,
uint8_t * formatversion )
+
+extern
+
+ +

Detect miniSEED record in buffer.

+

Determine if the buffer contains a miniSEED data record by verifying known signatures (fields with known limited values).

+

If miniSEED 2.x is detected, search the record up to recbuflen bytes for a 1000 blockette. If no blockette 1000 is found, search at 64-byte offsets for the fixed section of the next header, thereby implying the record length.

+
Parameters
+ + + + +
[in]recordBuffer to test for record
[in]recbuflenLength of buffer
[out]formatversionMajor version of format detected, 0 if unknown
+
+
+
Return values
+ + + + +
-1Data record not detected or error
0Data record detected but could not determine length
>0Size of the record in bytes
+
+
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_parse_raw3()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int ms_parse_raw3 (const char * record,
int maxreclen,
int8_t details )
+
+extern
+
+ +

Parse and verify a miniSEED 3.x record header.

+

Parsing is done at the lowest level, printing error messages for invalid header values and optionally print raw header values.

+

The buffer at record is assumed to be a miniSEED record. Not every possible test is performed, common errors and those causing library parsing to fail should be detected.

+

This routine is primarily intended to diagnose invalid miniSEED headers.

+
Parameters
+ + + + +
[in]recordBuffer to parse as miniSEED
[in]maxreclenMaximum length to search in buffer
[in]detailsControls diagnostic output as follows:
    +
  • 0 - only print error messages for invalid header fields
  • +
  • 1 - print basic fields in addition to invalid field errors
  • +
  • 2 - print all fields in addition to invalid field errors
  • +
+
+
+
+
Returns
0 when no errors were detected or a positive count of errors detected.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_parse_raw2()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int ms_parse_raw2 (const char * record,
int maxreclen,
int8_t details,
int8_t swapflag )
+
+extern
+
+ +

Parse and verify a miniSEED 2.x record header.

+

Parsing is done at the lowest level, printing error messages for invalid header values and optionally print raw header values.

+

The buffer record is assumed to be a miniSEED record. Not every possible test is performed, common errors and those causing libmseed parsing to fail should be detected.

+

This routine is primarily intended to diagnose invalid miniSEED headers.

+
Parameters
+ + + + + +
[in]recordBuffer to parse as miniSEED
[in]maxreclenMaximum length to search in buffer
[in]detailsControls diagnostic output as follows:
    +
  • 0 - only print error messages for invalid header fields
  • +
  • 1 - print basic fields in addition to invalid field errors
  • +
  • 2 - print all fields in addition to invalid field errors
  • +
+
[in]swapflagFlag controlling byte-swapping as follows:
    +
  • 1 - swap multibyte quantities
  • +
  • 0 - do not swap
  • +
  • -1 - autodetect byte order using year test, swap if needed
  • +
+
+
+
+
Returns
0 when no errors were detected or a positive count of errors detected.
+

MessageOnError - this function logs a message on error

+ +
+
+
+ + + + + diff --git a/group__record-list.html b/group__record-list.html new file mode 100644 index 0000000..5b043f3 --- /dev/null +++ b/group__record-list.html @@ -0,0 +1,232 @@ + + + + + + + +libmseed: Record List + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Record List
+
+
+ +

Functionality to build a list of records that contribute to a MS3TraceSeg. +More...

+ + + + + + + + +

+Data Structures

struct  MS3RecordPtr
 A miniSEED record pointer and metadata. More...
 
struct  MS3RecordList
 Record list, holds MS3RecordPtr entries that contribute to a given MS3TraceSeg. More...
 
+

Detailed Description

+

Functionality to build a list of records that contribute to a MS3TraceSeg.

+

As a Trace List is constructed from data records, a list of the records that contribute to each segment can be built by using the MSF_RECORDLIST flag to mstl3_readbuffer() and ms3_readtracelist(). Alternatively, a record list can be built by adding records to a Trace List using mstl3_addmsr_recordptr().

+

The main purpose of this functionality is to support an efficient, 2-pass pattern of first reading a summary of data followed by unpacking the samples. The unpacking can be performed selectively on desired segments and optionally placed in a caller-supplied buffer.

+

The mstl3_unpack_recordlist() function allows for the unpacking of data samples for a given MS3TraceSeg into a caller-specified buffer, or allocating the buffer if needed.

+
See also
mstl3_readbuffer()
+
+mstl3_readbuffer_selection()
+
+ms3_readtracelist()
+
+ms3_readtracelist_selection()
+
+mstl3_unpack_recordlist()
+
+mstl3_addmsr_recordptr()
+

Data Structure Documentation

+ +

◆ MS3RecordPtr

+ +
+
+ + + + +
struct MS3RecordPtr
+
+

A miniSEED record pointer and metadata.

+

Used to construct a list of data records that contributed to a trace segment.

+

The location of the record is identified at a memory address (bufferptr), the location in an open file (fileptr and fileoffset), or the location in a file (filename and fileoffset).

+

A MS3Record is stored with and contains the bit flags, extra headers, etc. for the record.

+

The dataoffset to the encoded data is stored to enable direct decoding of data samples without re-parsing the header, used by mstl3_unpack_recordlist().

+

Note: the list is stored in the time order that the entries contributed to the segment.

+
See also
mstl3_unpack_recordlist()
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Fields
+const char * +bufferptr +Pointer in buffer to record, NULL if not used.
+FILE * +fileptr +Pointer to open FILE containing record, NULL if not used.
+const char * +filename +Pointer to file name containing record, NULL if not used.
+int64_t +fileoffset +Offset into file to record for fileptr or filename.
+MS3Record * +msr +Pointer to MS3Record for this record.
+nstime_t +endtime +End time of record, time of last sample.
+uint32_t +dataoffset +Offset from start of record to encoded data.
+void * +prvtptr +Private pointer, will not be populated by library but will be free'd.
+struct MS3RecordPtr * +next +Pointer to next entry, NULL if the last.
+ +
+
+ +

◆ MS3RecordList

+ +
+
+ + + + +
struct MS3RecordList
+
+

Record list, holds MS3RecordPtr entries that contribute to a given MS3TraceSeg.

+
+ + + + + + + + + + +
Data Fields
+uint64_t +recordcnt +Count of records in the list (for convenience)
+MS3RecordPtr * +first +Pointer to first entry, NULL if the none.
+MS3RecordPtr * +last +Pointer to last entry, NULL if the none.
+ +
+
+
+ + + + + diff --git a/group__return-values.html b/group__return-values.html new file mode 100644 index 0000000..ae01924 --- /dev/null +++ b/group__return-values.html @@ -0,0 +1,134 @@ + + + + + + + +libmseed: Return codes + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ + +
+
+ +

Common error codes returned by library functions. Error values will always be negative. +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define MS_ENDOFFILE   1
 End of file reached return value.
 
+#define MS_NOERROR   0
 No error.
 
+#define MS_GENERROR   -1
 Generic unspecified error.
 
+#define MS_NOTSEED   -2
 Data not SEED.
 
+#define MS_WRONGLENGTH   -3
 Length of data read was not correct.
 
+#define MS_OUTOFRANGE   -4
 SEED record length out of range.
 
+#define MS_UNKNOWNFORMAT   -5
 Unknown data encoding format.
 
+#define MS_STBADCOMPFLAG   -6
 Steim, invalid compression flag(s)
 
+#define MS_INVALIDCRC   -7
 Invalid CRC.
 
+

Detailed Description

+

Common error codes returned by library functions. Error values will always be negative.

+
See also
ms_errorstr()
+
+ + + + + diff --git a/group__string-functions.html b/group__string-functions.html new file mode 100644 index 0000000..f1f781f --- /dev/null +++ b/group__string-functions.html @@ -0,0 +1,507 @@ + + + + + + + +libmseed: Source Identifiers + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Source Identifiers
+
+
+ +

Source identifier (SID) and string manipulation functions. +More...

+ + + + + + + + + + + + + + + + + + + + + + + +

+Functions

int ms_sid2nslc (const char *sid, char *net, char *sta, char *loc, char *chan)
 Parse network, station, location and channel from an FDSN Source ID.
 
int ms_nslc2sid (char *sid, int sidlen, uint16_t flags, const char *net, const char *sta, const char *loc, const char *chan)
 Convert network, station, location and channel to an FDSN Source ID.
 
int ms_seedchan2xchan (char *xchan, const char *seedchan)
 Convert SEED 2.x channel to extended channel.
 
int ms_xchan2seedchan (char *seedchan, const char *xchan)
 Convert extended channel to SEED 2.x channel.
 
int ms_strncpclean (char *dest, const char *source, int length)
 Copy string, removing spaces, always terminated.
 
int ms_strncpcleantail (char *dest, const char *source, int length)
 Copy string, removing trailing spaces, always terminated.
 
int ms_strncpopen (char *dest, const char *source, int length)
 Copy fixed number of characters into unterminated string.
 
+

Detailed Description

+

Source identifier (SID) and string manipulation functions.

+

A source identifier uniquely identifies the generator of data in a record. This is a small string, usually in the form of a URI. For data identified with FDSN codes, the SID is usally a simple combination of the codes.

+

Function Documentation

+ +

◆ ms_sid2nslc()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms_sid2nslc (const char * sid,
char * net,
char * sta,
char * loc,
char * chan )
+
+extern
+
+ +

Parse network, station, location and channel from an FDSN Source ID.

+

FDSN Source Identifiers are defined at: https://docs.fdsn.org/projects/source-identifiers/

+

Parse a source identifier into separate components, expecting: "FDSN:NET_STA_LOC_CHAN", where CHAN="BAND_SOURCE_POSITION"

+

The CHAN value will be converted to a SEED channel code if possible. Meaning, if the BAND, SOURCE, and POSITION are single characters, the underscore delimiters will not be included in the returned channel.

+

Identifiers may contain additional namespace identifiers, e.g.: "FDSN:AGENCY:NET_STA_LOC_CHAN"

+

Such additional namespaces are not part of the Source ID standard as of this writing and support is included for specialized usage or future identifier changes.

+

Memory for each component must already be allocated. If a specific component is not desired set the appropriate argument to NULL.

+
Parameters
+ + + + + + +
[in]sidSource identifier
[out]netNetwork code
[out]staStation code
[out]locLocation code
[out]chanChannel code
+
+
+
Return values
+ + + +
0on success
-1on error
+
+
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_nslc2sid()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms_nslc2sid (char * sid,
int sidlen,
uint16_t flags,
const char * net,
const char * sta,
const char * loc,
const char * chan )
+
+extern
+
+ +

Convert network, station, location and channel to an FDSN Source ID.

+

FDSN Source Identifiers are defined at: https://docs.fdsn.org/projects/source-identifiers/

+

Create a source identifier from individual network, station, location and channel codes with the form: FDSN:NET_STA_LOC_CHAN, where CHAN="BAND_SOURCE_POSITION"

+

Memory for the source identifier must already be allocated.

+

If the loc value is NULL it will be empty in the resulting Source ID.

+

The chan value will be converted to extended channel format if it appears to be in SEED channel form. Meaning, if the chan is 3 characters with no delimiters, it will be converted to "BAND_SOURCE_POSITION" form by adding delimiters between the codes.

+
Parameters
+ + + + + + + + +
[out]sidDestination string for source identifier
sidlenMaximum length of sid
flagsCurrently unused, set to 0
[in]netNetwork code
[in]staStation code
[in]locLocation code
[in]chanChannel code
+
+
+
Returns
length of source identifier
+
Return values
+ + +
-1on error
+
+
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_seedchan2xchan()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
int ms_seedchan2xchan (char * xchan,
const char * seedchan )
+
+extern
+
+ +

Convert SEED 2.x channel to extended channel.

+

The SEED 2.x channel at seedchan must be a 3-character string. The xchan buffer must be at least 6 bytes, for the extended channel (band,source,position) and the terminating NULL.

+

This functionality simply maps patterns, it does not check the validity of any codes.

+
Parameters
+ + + +
[out]xchanDestination for extended channel string, must be at least 6 bytes
[in]seedchanSource string, must be a 3-character string
+
+
+
Return values
+ + + +
0on successful mapping of channel
-1on error
+
+
+ +
+
+ +

◆ ms_xchan2seedchan()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
int ms_xchan2seedchan (char * seedchan,
const char * xchan )
+
+extern
+
+ +

Convert extended channel to SEED 2.x channel.

+

The extended channel at xchan must be a 5-character string.

+

The seedchan buffer must be at least 4 bytes, for the SEED channel and the terminating NULL. Alternatively, seedchan may be set to NULL in which case this function becomes a test for whether the xchan could be mapped without actually doing the conversion. Finally, seedchan can be the same buffer as xchan for an in-place conversion.

+

This routine simply maps patterns, it does not check the validity of any specific codes.

+
Parameters
+ + + +
[out]seedchanDestination for SEED channel string, must be at least 4 bytes
[in]xchanSource string, must be a 5-character string
+
+
+
Return values
+ + + +
0on successful mapping of channel
-1on error
+
+
+ +
+
+ +

◆ ms_strncpclean()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int ms_strncpclean (char * dest,
const char * source,
int length )
+
+extern
+
+ +

Copy string, removing spaces, always terminated.

+

Copy up to length bytes of UTF-8 characters from source to dest while removing all spaces. The result is left justified and always null terminated.

+

The destination string must have enough room needed for the non-space characters within length and the null terminator, a maximum of length + 1.

+
Parameters
+ + + + +
[out]destDestination for terminated string
[in]sourceSource string
[in]lengthLength of characters for destination string in bytes
+
+
+
Returns
the number of characters (not including the null terminator) in the destination string
+ +
+
+ +

◆ ms_strncpcleantail()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int ms_strncpcleantail (char * dest,
const char * source,
int length )
+
+extern
+
+ +

Copy string, removing trailing spaces, always terminated.

+

Copy up to length bytes of UTF-8 characters from source to dest without any trailing spaces. The result is left justified and always null terminated.

+

The destination string must have enough room needed for the characters within length and the null terminator, a maximum of length + 1.

+
Parameters
+ + + + +
[out]destDestination for terminated string
[in]sourceSource string
[in]lengthLength of characters for destination string in bytes
+
+
+
Returns
The number of characters (not including the null terminator) in the destination string
+ +
+
+ +

◆ ms_strncpopen()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int ms_strncpopen (char * dest,
const char * source,
int length )
+
+extern
+
+ +

Copy fixed number of characters into unterminated string.

+

Copy length bytes of UTF-8 characters from source to dest, padding the right side with spaces and leave open-ended, aka un-terminated. The result is left justified and never null terminated.

+

The destination string must have enough room for length characters.

+
Parameters
+ + + + +
[out]destDestination for unterminated string
[in]sourceSource string
[in]lengthLength of characters for destination string in bytes
+
+
+
Returns
the number of characters copied from the source string
+ +
+
+
+ + + + + diff --git a/group__time-related.html b/group__time-related.html new file mode 100644 index 0000000..c50c55b --- /dev/null +++ b/group__time-related.html @@ -0,0 +1,795 @@ + + + + + + + +libmseed: Time definitions and functions + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Time definitions and functions
+
+
+ +

Definitions and functions for related to library time values. +More...

+ + + + + + + + + + + + + + + + + + + + + + + +

+Macros

+#define NSTMODULUS   1000000000
 Define the high precision time tick interval as 1/modulus seconds corresponding to nanoseconds.
 
+#define NSTERROR   -2145916800000000000LL
 Error code for routines that normally return a high precision time. The time value corresponds to '1902-01-01T00:00:00.000000000Z'.
 
+#define NSTUNSET   -2145916799999999999LL
 Special nstime_t value meaning "unset". The time value corresponds to '1902-01-01T00:00:00.000000001Z'.
 
+#define MS_EPOCH2NSTIME(X)   (X) * (nstime_t) NSTMODULUS
 macro to convert Unix/POSIX epoch time to high precision epoch time
 
+#define MS_NSTIME2EPOCH(X)   (X) / NSTMODULUS
 Macro to convert high precision epoch time to Unix/POSIX epoch time.
 
#define MS_HPTIME2NSTIME(X)   (X) * (nstime_t) 1000
 Convert a hptime_t value (used by previous releases) to nstime_t.
 
#define MS_NSTIME2HPTIME(X)   (X) / 1000
 Convert an nstime_t value to hptime_t (used by previous releases)
 
+ + + + +

+Typedefs

typedef int64_t nstime_t
 libmseed time type, integer nanoseconds since the Unix/POSIX epoch (00:00:00 Thursday, 1 January 1970)
 
+ + + + + + + +

+Enumerations

enum  ms_timeformat_t {
+  ISOMONTHDAY = 0 +, ISOMONTHDAY_Z = 1 +, ISOMONTHDAY_DOY = 2 +, ISOMONTHDAY_DOY_Z = 3 +,
+  ISOMONTHDAY_SPACE = 4 +, ISOMONTHDAY_SPACE_Z = 5 +, SEEDORDINAL = 6 +, UNIXEPOCH = 7 +,
+  NANOSECONDEPOCH = 8 +
+ }
 Time format identifiers. More...
 
enum  ms_subseconds_t {
+  NONE = 0 +, MICRO = 1 +, NANO = 2 +, MICRO_NONE = 3 +,
+  NANO_NONE = 4 +, NANO_MICRO = 5 +, NANO_MICRO_NONE = 6 +
+ }
 Subsecond format identifiers. More...
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

int ms_nstime2time (nstime_t nstime, uint16_t *year, uint16_t *yday, uint8_t *hour, uint8_t *min, uint8_t *sec, uint32_t *nsec)
 Convert an nstime_t to individual date-time components.
 
char * ms_nstime2timestr (nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subsecond)
 Convert an nstime_t to a time string.
 
DEPRECATED char * ms_nstime2timestrz (nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subsecond)
 Convert an nstime_t to a time string with 'Z' suffix.
 
nstime_t ms_time2nstime (int year, int yday, int hour, int min, int sec, uint32_t nsec)
 Convert specified date-time values to a high precision epoch time.
 
nstime_t ms_timestr2nstime (const char *timestr)
 Convert a time string to a high precision epoch time.
 
nstime_t ms_mdtimestr2nstime (const char *timestr)
 Convert a time string (year-month-day) to a high precision epoch time.
 
nstime_t ms_seedtimestr2nstime (const char *seedtimestr)
 Convert an SEED-style (ordinate date, i.e. day-of-year) time string to a high precision epoch time.
 
int ms_doy2md (int year, int yday, int *month, int *mday)
 Compute the month and day-of-month from a year and day-of-year.
 
int ms_md2doy (int year, int month, int mday, int *yday)
 Compute the day-of-year from a year, month and day-of-month.
 
+

Detailed Description

+

Definitions and functions for related to library time values.

+

Internally the library uses an integer value to represent time as the number of nanoseconds since the Unix/POSIX epoch (Jan 1 1970).

+

Macro Definition Documentation

+ +

◆ MS_HPTIME2NSTIME

+ +
+
+ + + + + + + +
#define MS_HPTIME2NSTIME( X)   (X) * (nstime_t) 1000
+
+ +

Convert a hptime_t value (used by previous releases) to nstime_t.

+

An HTPTIME/hptime_t value, used by libmseed major version <= 2, defines microsecond ticks. An NSTIME/nstime_t value, used by this version of the library, defines nanosecond ticks.

+ +
+
+ +

◆ MS_NSTIME2HPTIME

+ +
+
+ + + + + + + +
#define MS_NSTIME2HPTIME( X)   (X) / 1000
+
+ +

Convert an nstime_t value to hptime_t (used by previous releases)

+

An HTPTIME/hptime_t value, used by libmseed major version <= 2, defines microsecond ticks. An NSTIME/nstime_t value, used by this version of the library, defines nanosecond ticks.

+ +
+
+

Typedef Documentation

+ +

◆ nstime_t

+ +
+
+ + + + +
typedef int64_t nstime_t
+
+ +

libmseed time type, integer nanoseconds since the Unix/POSIX epoch (00:00:00 Thursday, 1 January 1970)

+

This time scale can represent a range from before year 0 through mid-year 2262.

+ +
+
+

Enumeration Type Documentation

+ +

◆ ms_timeformat_t

+ +
+
+ + + + +
enum ms_timeformat_t
+
+ +

Time format identifiers.

+

Formats values:

    +
  • ISOMONTHDAY - "YYYY-MM-DDThh:mm:ss.sssssssss", ISO 8601 in month-day format
  • +
  • ISOMONTHDAY_Z - "YYYY-MM-DDThh:mm:ss.sssssssss", ISO 8601 in month-day format with trailing Z
  • +
  • ISOMONTHDAY_DOY - "YYYY-MM-DD hh:mm:ss.sssssssss (doy)", ISOMONTHDAY with day-of-year
  • +
  • ISOMONTHDAY_DOY_Z - "YYYY-MM-DD hh:mm:ss.sssssssss (doy)", ISOMONTHDAY with day-of-year and trailing Z
  • +
  • ISOMONTHDAY_SPACE - "YYYY-MM-DD hh:mm:ss.sssssssss", same as ISOMONTHDAY with space separator
  • +
  • ISOMONTHDAY_SPACE_Z - "YYYY-MM-DD hh:mm:ss.sssssssss", same as ISOMONTHDAY with space separator and trailing Z
  • +
  • SEEDORDINAL - "YYYY,DDD,hh:mm:ss.sssssssss", SEED day-of-year format
  • +
  • UNIXEPOCH - "ssssssssss.sssssssss", Unix epoch value
  • +
  • NANOSECONDEPOCH - "sssssssssssssssssss", Nanosecond epoch value
  • +
+ +
+
+ +

◆ ms_subseconds_t

+ +
+
+ + + + +
enum ms_subseconds_t
+
+ +

Subsecond format identifiers.

+

Formats values:

    +
  • NONE - No subseconds
  • +
  • MICRO - Microsecond resolution
  • +
  • NANO - Nanosecond resolution
  • +
  • MICRO_NONE - Microsecond resolution if subseconds are non-zero, otherwise no subseconds
  • +
  • NANO_NONE - Nanosecond resolution if subseconds are non-zero, otherwise no subseconds
  • +
  • NANO_MICRO - Nanosecond resolution if there are sub-microseconds, otherwise microseconds resolution
  • +
  • NANO_MICRO_NONE - Nanosecond resolution if present, microsecond if present, otherwise no subseconds
  • +
+ +
+
+

Function Documentation

+ +

◆ ms_nstime2time()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int ms_nstime2time (nstime_t nstime,
uint16_t * year,
uint16_t * yday,
uint8_t * hour,
uint8_t * min,
uint8_t * sec,
uint32_t * nsec )
+
+extern
+
+ +

Convert an nstime_t to individual date-time components.

+

Each of the destination date-time are optional, pass NULL if the value is not desired.

+
Parameters
+ + + + + + + + +
[in]nstimeTime value to convert
[out]yearYear with century, like 2018
[out]ydayDay of year, 1 - 366
[out]hourHour, 0 - 23
[out]minMinute, 0 - 59
[out]secSecond, 0 - 60, where 60 is a leap second
[out]nsecNanoseconds, 0 - 999999999
+
+
+
Return values
+ + + +
0on success
-1on error
+
+
+ +
+
+ +

◆ ms_nstime2timestr()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
char * ms_nstime2timestr (nstime_t nstime,
char * timestr,
ms_timeformat_t timeformat,
ms_subseconds_t subseconds )
+
+extern
+
+ +

Convert an nstime_t to a time string.

+

Create a time string representation of a high precision epoch time in ISO 8601 and SEED formats.

+

The provided timestr buffer must have enough room for the resulting time string, a maximum of 36 characters + terminating NULL.

+

The subseconds flag controls whether the subsecond portion of the time is included or not. The value of subseconds is ignored when the format is NANOSECONDEPOCH. When non-zero subseconds are "trimmed" using these flags there is no rounding, instead it is simple truncation.

+
Parameters
+ + + + + +
[in]nstimeTime value to convert
[out]timestrBuffer for ISO time string
timeformatTime string format, one of ms_timeformat_t
subsecondsInclusion of subseconds, one of ms_subseconds_t
+
+
+
Returns
Pointer to the resulting string or NULL on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_nstime2timestrz()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
DEPRECATED char * ms_nstime2timestrz (nstime_t nstime,
char * timestr,
ms_timeformat_t timeformat,
ms_subseconds_t subseconds )
+
+extern
+
+ +

Convert an nstime_t to a time string with 'Z' suffix.

+
Deprecated
This function should be replaced with desired use of timeformat values with the '_Z' designator.
+

This function is a thin wrapper of ms_nstime2timestr

+
Parameters
+ + + + + +
[in]nstimeTime value to convert
[out]timestrBuffer for ISO time string
timeformatTime string format, one of ms_timeformat_t
subsecondsInclusion of subseconds, one of ms_subseconds_t
+
+
+
Returns
Pointer to the resulting string or NULL on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_time2nstime()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
nstime_t ms_time2nstime (int year,
int yday,
int hour,
int min,
int sec,
uint32_t nsec )
+
+extern
+
+ +

Convert specified date-time values to a high precision epoch time.

+
Parameters
+ + + + + + + +
[in]yearYear with century, like 2018
[in]ydayDay of year, 1 - 366
[in]hourHour, 0 - 23
[in]minMinute, 0 - 59
[in]secSecond, 0 - 60, where 60 is a leap second
[in]nsecNanoseconds, 0 - 999999999
+
+
+
Returns
epoch time on success and NSTERROR on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_timestr2nstime()

+ +
+
+ + + + + +
+ + + + + + + +
nstime_t ms_timestr2nstime (const char * timestr)
+
+extern
+
+ +

Convert a time string to a high precision epoch time.

+

Detected time formats:

    +
  1. ISO month-day as "YYYY-MM-DD[THH:MM:SS.FFFFFFFFF]"
  2. +
  3. ISO ordinal as "YYYY-DDD[THH:MM:SS.FFFFFFFFF]"
  4. +
  5. SEED ordinal as "YYYY,DDD[,HH,MM,SS,FFFFFFFFF]"
  6. +
  7. Year as "YYYY"
  8. +
  9. Unix/POSIX epoch time value as "[+-]#########.#########"
  10. +
+

Following determination of the format, non-epoch value conversion is performed by the ms_mdtimestr2nstime() and ms_seedtimestr2nstime() routines.

+

Four-digit values are treated as a year, unless a sign [+-] is specified and then they are treated as epoch values. For consistency, a caller is recommened to always include a sign with epoch values.

+

Note that this routine does some sanity checking of the time string contents, but does not perform robust date-time validation.

+
Parameters
+ + +
[in]timestrTime string to convert
+
+
+
Returns
epoch time on success and NSTERROR on error.
+

MessageOnError - this function logs a message on error

+
See also
ms_mdtimestr2nstime()
+
+ms_seedtimestr2nstime()
+ +
+
+ +

◆ ms_mdtimestr2nstime()

+ +
+
+ + + + + +
+ + + + + + + +
nstime_t ms_mdtimestr2nstime (const char * timestr)
+
+extern
+
+ +

Convert a time string (year-month-day) to a high precision epoch time.

+

The time format expected is "YYYY[-MM-DD HH:MM:SS.FFFFFFFFF]", the delimiter can be a dash [-], comma[,], slash [/], colon [:], or period [.]. Additionally a 'T' or space may be used between the date and time fields. The fractional seconds ("FFFFFFFFF") must begin with a period [.] if present.

+

The time string can be "short" in which case the omitted values are assumed to be zero (with the exception of month and day which are assumed to be 1). For example, specifying "YYYY-MM-DD" assumes HH, MM, SS and FFFF are 0. The year is required, otherwise there wouldn't be much for a date.

+
Parameters
+ + +
[in]timestrTime string in ISO-style, month-day format
+
+
+
Returns
epoch time on success and NSTERROR on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_seedtimestr2nstime()

+ +
+
+ + + + + +
+ + + + + + + +
nstime_t ms_seedtimestr2nstime (const char * seedtimestr)
+
+extern
+
+ +

Convert an SEED-style (ordinate date, i.e. day-of-year) time string to a high precision epoch time.

+

The time format expected is "YYYY[,DDD,HH,MM,SS.FFFFFFFFF]", the delimiter can be a dash [-], comma [,], colon [:] or period [.]. Additionally a [T] or space may be used to seprate the day and hour fields. The fractional seconds ("FFFFFFFFF") must begin with a period [.] if present.

+

The time string can be "short" in which case the omitted values are assumed to be zero (with the exception of DDD which is assumed to be 1): "YYYY,DDD,HH" assumes MM, SS and FFFFFFFF are 0. The year is required, otherwise there wouldn't be much for a date.

+
Parameters
+ + +
[in]seedtimestrTime string in SEED-style, ordinal date format
+
+
+
Returns
epoch time on success and NSTERROR on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_doy2md()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int ms_doy2md (int year,
int yday,
int * month,
int * mday )
+
+extern
+
+ +

Compute the month and day-of-month from a year and day-of-year.

+
Parameters
+ + + + + +
[in]yearYear in range 1000-2262
[in]ydayDay of year in range 1-365 or 366 for leap year
[out]monthMonth in range 1-12
[out]mdayDay of month in range 1-31
+
+
+
Return values
+ + + +
0on success
-1on error
+
+
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ ms_md2doy()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
int ms_md2doy (int year,
int month,
int mday,
int * yday )
+
+extern
+
+ +

Compute the day-of-year from a year, month and day-of-month.

+
Parameters
+ + + + + +
[in]yearYear in range 1000-2262
[in]monthMonth in range 1-12
[in]mdayDay of month in range 1-31 (or appropriate last day)
[out]ydayDay of year in range 1-366 or 366 for leap year
+
+
+
Return values
+ + + +
0on success
-1on error
+
+
+

MessageOnError - this function logs a message on error

+ +
+
+
+ + + + + diff --git a/group__trace-list.html b/group__trace-list.html new file mode 100644 index 0000000..1ea86f3 --- /dev/null +++ b/group__trace-list.html @@ -0,0 +1,1247 @@ + + + + + + + +libmseed: Trace List + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
Trace List
+
+
+ +

A container for continuous data. +More...

+ + + + + + + + + + + + + + +

+Data Structures

struct  MS3TraceSeg
 Container for a continuous trace segment, linkable. More...
 
struct  MS3TraceID
 Container for a trace ID, linkable. More...
 
struct  MS3TraceList
 Container for a collection of continuous trace segment, linkable. More...
 
struct  MS3Tolerance
 Callback functions that return time and sample rate tolerances. More...
 
+ + + + + + + + + + +

+Macros

+#define MSTRACEID_SKIPLIST_HEIGHT   8
 Maximum skip list height for MSTraceIDs.
 
#define MS3Tolerance_INITIALIZER
 Initialializer for the tolerances MS3Tolerance.
 
#define mstl3_addmsr(mstl, msr, splitversion, autoheal, flags, tolerance)    mstl3_addmsr_recordptr (mstl, msr, NULL, splitversion, autoheal, flags, tolerance)
 Add a MS3Record to a MS3TraceList.
 
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

MS3TraceListmstl3_init (MS3TraceList *mstl)
 Initialize a MS3TraceList container.
 
void mstl3_free (MS3TraceList **ppmstl, int8_t freeprvtptr)
 Free all memory associated with a MS3TraceList.
 
MS3TraceIDmstl3_findID (MS3TraceList *mstl, const char *sid, uint8_t pubversion, MS3TraceID **prev)
 Find matching MS3TraceID in a MS3TraceList.
 
MS3TraceSegmstl3_addmsr_recordptr (MS3TraceList *mstl, const MS3Record *msr, MS3RecordPtr **pprecptr, int8_t splitversion, int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance)
 Add data coverage from an MS3Record to a MS3TraceList.
 
int64_t mstl3_readbuffer (MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, int8_t verbose)
 Parse miniSEED from a buffer and populate a MS3TraceList.
 
int64_t mstl3_readbuffer_selection (MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t verbose)
 Parse miniSEED from a buffer and populate a MS3TraceList.
 
int64_t mstl3_unpack_recordlist (MS3TraceID *id, MS3TraceSeg *seg, void *output, uint64_t outputsize, int8_t verbose)
 Unpack data samples in a Record List associated with a MS3TraceList.
 
int mstl3_convertsamples (MS3TraceSeg *seg, char type, int8_t truncate)
 Convert the data samples associated with an MS3TraceSeg to another data type.
 
int mstl3_resize_buffers (MS3TraceList *mstl)
 Resize data sample buffers of MS3TraceList to what is needed.
 
int64_t mstl3_pack (MS3TraceList *mstl, void(*record_handler)(char *, int, void *), void *handlerdata, int reclen, int8_t encoding, int64_t *packedsamples, uint32_t flags, int8_t verbose, char *extra)
 Pack MS3TraceList data into miniSEED records.
 
void mstl3_printtracelist (const MS3TraceList *mstl, ms_timeformat_t timeformat, int8_t details, int8_t gaps, int8_t versions)
 Print trace list summary information for a MS3TraceList.
 
void mstl3_printsynclist (const MS3TraceList *mstl, const char *dccid, ms_subseconds_t subseconds)
 Print SYNC trace list summary information for a MS3TraceList.
 
void mstl3_printgaplist (const MS3TraceList *mstl, ms_timeformat_t timeformat, double *mingap, double *maxgap)
 Print gap/overlap list summary information for a MS3TraceList.
 
+

Detailed Description

+

A container for continuous data.

+

Trace lists are a container to organize continuous segments of data. By combining miniSEED data records into trace lists, the time series is reconstructed and ready for processing or summarization.

+

A trace list container starts with an MS3TraceList, which contains one or more MS3TraceID entries, which each contain one or more MS3TraceSeg entries. The MS3TraceID and MS3TraceSeg entries are easily traversed as linked structures.

+

The overall structure is illustrated as:

+
See also
ms3_readtracelist()
+
+ms3_readtracelist_timewin()
+
+ms3_readtracelist_selection()
+
+mstl3_writemseed()
+

Data Structure Documentation

+ +

◆ MS3TraceSeg

+ +
+
+ + + + +
struct MS3TraceSeg
+
+

Container for a continuous trace segment, linkable.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Fields
+nstime_t +starttime +Time of first sample.
+nstime_t +endtime +Time of last sample.
+double +samprate +Nominal sample rate (Hz)
+int64_t +samplecnt +Number of samples in trace coverage.
+void * +datasamples +Data samples, numsamples of type sampletype.
+uint64_t +datasize +Size of datasamples buffer in bytes.
+int64_t +numsamples +Number of data samples in datasamples.
+char +sampletype +Sample type code, see Sample Types.
+void * +prvtptr +Private pointer for general use, unused by library.
+struct MS3RecordList * +recordlist +List of pointers to records that contributed.
+struct MS3TraceSeg * +prev +Pointer to previous segment.
+struct MS3TraceSeg * +next +Pointer to next segment, NULL if the last.
+ +
+
+ +

◆ MS3TraceID

+ +
+
+ + + + +
struct MS3TraceID
+
+

Container for a trace ID, linkable.

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Data Fields
+char +sid[LM_SIDLEN] +Source identifier as URN, max length LM_SIDLEN.
+uint8_t +pubversion +Largest contributing publication version.
+nstime_t +earliest +Time of earliest sample.
+nstime_t +latest +Time of latest sample.
+void * +prvtptr +Private pointer for general use, unused by library.
+uint32_t +numsegments +Number of segments for this ID.
+struct MS3TraceSeg * +first +Pointer to first of list of segments.
+struct MS3TraceSeg * +last +Pointer to last of list of segments.
+struct MS3TraceID * +next[MSTRACEID_SKIPLIST_HEIGHT] +Next trace ID at first pointer, NULL if the last.
+uint8_t +height +Height of skip list at next.
+ +
+
+ +

◆ MS3TraceList

+ +
+
+ + + + +
struct MS3TraceList
+
+

Container for a collection of continuous trace segment, linkable.

+
+ + + + + + + + + + +
Data Fields
+uint32_t +numtraceids +Number of traces IDs in list.
+struct MS3TraceID +traces +Head node of trace skip list, first entry at traces.next[0].
+uint64_t +prngstate +INTERNAL: State for Pseudo RNG.
+ +
+
+

Macro Definition Documentation

+ +

◆ MS3Tolerance_INITIALIZER

+ +
+
+ + + + +
#define MS3Tolerance_INITIALIZER
+
+Value:
{ \
+
.time = NULL, .samprate = NULL \
+
}
+
+

Initialializer for the tolerances MS3Tolerance.

+ +
+
+ +

◆ mstl3_addmsr

+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
#define mstl3_addmsr( mstl,
msr,
splitversion,
autoheal,
flags,
tolerance )    mstl3_addmsr_recordptr (mstl, msr, NULL, splitversion, autoheal, flags, tolerance)
+
+ +

Add a MS3Record to a MS3TraceList.

+
See also
mstl3_addmsr_recordptr()
+ +
+
+

Function Documentation

+ +

◆ mstl3_init()

+ +
+
+ + + + + +
+ + + + + + + +
MS3TraceList * mstl3_init (MS3TraceList * mstl)
+
+extern
+
+ +

Initialize a MS3TraceList container.

+

A new MS3TraceList is allocated if needed. If the supplied MS3TraceList is not NULL it will be re-initialized and any associated memory will be freed including data at prvtptr pointers.

+
Parameters
+ + +
[in]mstlMS3TraceList to reinitialize or NULL
+
+
+
Returns
a pointer to a MS3TraceList struct on success or NULL on error.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ mstl3_free()

+ +
+
+ + + + + +
+ + + + + + + + + + + +
void mstl3_free (MS3TraceList ** ppmstl,
int8_t freeprvtptr )
+
+extern
+
+ +

Free all memory associated with a MS3TraceList.

+

The pointer to the target MS3TraceList will be set to NULL.

+
Parameters
+ + + +
[in]ppmstlPointer-to-pointer to the target MS3TraceList to free
[in]freeprvtptrIf true, also free any data at the prvtptr members of MS3TraceID.prvtptr, MS3TraceSeg.prvtptr, and MS3RecordPtr.prvtptr (in MS3TraceSeg.recordlist)
+
+
+ +
+
+ +

◆ mstl3_findID()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
MS3TraceID * mstl3_findID (MS3TraceList * mstl,
const char * sid,
uint8_t pubversion,
MS3TraceID ** prev )
+
+extern
+
+ +

Find matching MS3TraceID in a MS3TraceList.

+

Return the MS3TraceID matching the sid in the specified MS3TraceList.

+

If prev is not NULL, set pointers to previous entries for the expected location of the trace ID. Useful for adding a new ID with mstl3_addID(), and should be set to NULL otherwise.

+
Parameters
+ + + + + +
[in]mstlPointer to the MS3TraceList to search
[in]sidSource ID to search for in the list
[in]pubversionIf non-zero, find the entry with this version
[out]prevPointers to previous entries in expected location or NULL
+
+
+
Returns
a pointer to the matching MS3TraceID or NULL if not found or error.
+ +
+
+ +

◆ mstl3_addmsr_recordptr()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
MS3TraceSeg * mstl3_addmsr_recordptr (MS3TraceList * mstl,
const MS3Record * msr,
MS3RecordPtr ** pprecptr,
int8_t splitversion,
int8_t autoheal,
uint32_t flags,
const MS3Tolerance * tolerance )
+
+extern
+
+ +

Add data coverage from an MS3Record to a MS3TraceList.

+

Searching the list for the appropriate MS3TraceID and MS3TraceSeg and either add data to existing entries or create new ones as needed.

+

As this routine adds data to a trace list it constructs continuous time series, merging segments when possible. The tolerance pointer to a MS3Tolerance identifies function pointers that are expected to return time tolerace, in seconds, and sample rate tolerance, in Hertz, for the given MS3Record. If tolerance is NULL, or the function pointers it identifies are NULL, default tolerances will be used as follows: - Default time tolerance is 1/2 the sampling period - Default sample rate (sr) tolerance is abs(1‐sr1/sr2) < 0.0001

+

In recommended usage, the splitversion flag is 0 and different publication versions of otherwise matching data are merged. If more than one version contributes to a given source identifer's segments, its MS3TraceID.pubversion will be the set to the largest contributing version. If the splitversion flag is 1 the publication versions will be kept separate with each version isolated in separate MS3TraceID entries.

+

If the autoheal flag is true, extra processing is invoked to conjoin trace segments that fit together after the MS3Record coverage is added. For segments that are removed, any memory at the MS3TraceSeg.prvtptr will be freed.

+

If the pprecptr is not NULL a Record List will be maintained for each segment. If the value of *pprecptr is NULL, a new MS3RecordPtr will be allocated, otherwise the supplied structure will be updated. The MS3RecordPtr will be added to the appropriate record list and the values of MS3RecordPtr.msr and MS3RecordPtr.endtime will be set, all other fields should be set by the caller.

+

The lists are always maintained in a sorted order. An MS3TraceList is maintained with the MS3TraceID entries in ascending alphanumeric order of SID. If repeated SIDs are present due to splitting on publication version, they are maintained in order of ascending version. A MS3TraceID is always maintained with MS3TraceSeg entries in data time time order.

+
Parameters
+ + + + + + + + +
[in]mstlDestination MS3TraceList to add data to
[in]msrMS3Record containing the data to add to list
[in]pprecptrPointer to pointer to a MS3RecordPtr for Record List
[in]splitversionFlag to control splitting of version/quality
[in]autohealFlag to control automatic merging of segments
[in]flagsFlags to control optional functionality (unused)
[in]toleranceTolerance function pointers as MS3Tolerance
+
+
+
Returns
a pointer to the MS3TraceSeg updated or NULL on error.
+
See also
mstl3_readbuffer()
+
+ms3_readtracelist()
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ mstl3_readbuffer()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int64_t mstl3_readbuffer (MS3TraceList ** ppmstl,
const char * buffer,
uint64_t bufferlength,
int8_t splitversion,
uint32_t flags,
const MS3Tolerance * tolerance,
int8_t verbose )
+
+extern
+
+ +

Parse miniSEED from a buffer and populate a MS3TraceList.

+

For a full description of tolerance see mstl3_addmsr().

+

If the MSF_UNPACKDATA flag is set in flags, the data samples will be unpacked. In most cases the caller probably wants this flag set, without it the trace list will merely be a list of channels.

+

If the MSF_RECORDLIST flag is set in flags, a MS3RecordList will be built for each MS3TraceSeg. The MS3RecordPtr entries contain the location of the data record, bit flags, extra headers, etc.

+
Parameters
+ + + + + + + + +
[in]ppmstlPointer-to-point to destination MS3TraceList
[in]bufferSource buffer to read miniSEED records from
[in]bufferlengthMaximum length of buffer
[in]splitversionFlag to control splitting of version/quality
[in]flagsFlags to control parsing and optional functionality: +
[in]toleranceTolerance function pointers as MS3Tolerance
[in]verboseControls verbosity, 0 means no diagnostic output
+
+
+
Returns
The number of records parsed on success, otherwise a negative library error code.
+

MessageOnError - this function logs a message on error

+
See also
mstl3_addmsr()
+ +
+
+ +

◆ mstl3_readbuffer_selection()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int64_t mstl3_readbuffer_selection (MS3TraceList ** ppmstl,
const char * buffer,
uint64_t bufferlength,
int8_t splitversion,
uint32_t flags,
const MS3Tolerance * tolerance,
const MS3Selections * selections,
int8_t verbose )
+
+extern
+
+ +

Parse miniSEED from a buffer and populate a MS3TraceList.

+

For a full description of tolerance see mstl3_addmsr().

+

If the MSF_UNPACKDATA flag is set in flags, the data samples will be unpacked. In most cases the caller probably wants this flag set, without it the trace list will merely be a list of channels.

+

If the MSF_RECORDLIST flag is set in flags, a MS3RecordList will be built for each MS3TraceSeg. The MS3RecordPtr entries contain the location of the data record, bit flags, extra headers, etc.

+

If selections is not NULL, the MS3Selections will be used to limit what is returned to the caller. Any data not matching the selections will be skipped.

+
Parameters
+ + + + + + + + + +
[in]ppmstlPointer-to-point to destination MS3TraceList
[in]bufferSource buffer to read miniSEED records from
[in]bufferlengthMaximum length of buffer
[in]splitversionFlag to control splitting of version/quality
[in]flagsFlags to control parsing and optional functionality: +
[in]toleranceTolerance function pointers as MS3Tolerance
[in]selectionsSpecify limits to which data should be returned, see Data Selections
[in]verboseControls verbosity, 0 means no diagnostic output
+
+
+
Returns
The number of records parsed on success, otherwise a negative library error code.
+

MessageOnError - this function logs a message on error

+
See also
mstl3_addmsr()
+ +
+
+ +

◆ mstl3_unpack_recordlist()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
int64_t mstl3_unpack_recordlist (MS3TraceID * id,
MS3TraceSeg * seg,
void * output,
uint64_t outputsize,
int8_t verbose )
+
+extern
+
+ +

Unpack data samples in a Record List associated with a MS3TraceList.

+

Normally a record list is created calling by ms3_readtracelist() or mstl3_readbuffer() with the MSF_RECORDLIST flag.

+

Unpacked data samples are written to the provided output buffer (up to outputsize bytes). If output is NULL, a buffer will be allocated and associated with the MS3TraceSeg, just as if the data were unpacked while constructing the Trace List.

+

The sample type of the decoded data is stored at MS3TraceSeg.sampletype (i.e. seg->sampletype).

+

A record pointer entry has multiple ways to identify the location of a record: memory buffer, open file (FILE *) or file name. This routine uses the first populated record location in the following order:

    +
  1. Buffer pointer (MS3RecordPtr.bufferptr)
  2. +
  3. Open file and offset (MS3RecordPtr.fileptr and MS3RecordPtr.fileoffset)
  4. +
  5. File name and offset (MS3RecordPtr.filename and MS3RecordPtr.fileoffset)
  6. +
+

It would be unusual to build a record list outside of the library, but should that ever occur note that the record list is assumed to be in correct time order and represent a contiguous time series.

+
Parameters
+ + + + + + +
[in]idMS3TraceID for relevant MS3TraceSeg
[in]segMS3TraceSeg with associated Record List to unpack
[out]outputOutput buffer for data samples, can be NULL
[in]outputsizeSize of output buffer
[in]verboseControls logging verbosity, 0 is no diagnostic output
+
+
+
Returns
the number of samples unpacked or -1 on error.
+

MessageOnError - this function logs a message on error

+
See also
mstl3_readbuffer()
+
+mstl3_readbuffer_selection()
+
+ms3_readtracelist()
+
+ms3_readtracelist_selection()
+ +
+
+ +

◆ mstl3_convertsamples()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int mstl3_convertsamples (MS3TraceSeg * seg,
char type,
int8_t truncate )
+
+extern
+
+ +

Convert the data samples associated with an MS3TraceSeg to another data type.

+

Text data samples cannot be converted, if supplied or requested an error will be returned.

+

When converting float & double sample types to integer type a simple rounding is applied by adding 0.5 to the sample value before converting (truncating) to integer. This compensates for common machine representations of floating point values, e.g. "40.0" represented by "39.99999999".

+

If the truncate flag is true (non-zero) data samples will be truncated to integers even if loss of sample precision is detected. If the truncate flag is false (zero) and loss of precision is detected an error is returned. Loss of precision is determined by testing that the difference between the floating point value and the (truncated) integer value is greater than 0.000001.

+
Parameters
+ + + + +
[in]segThe target MS3TraceSeg to convert
[in]typeThe desired data sample type:
    +
  • 'i' - 32-bit integer data type
  • +
  • 'f' - 32-bit float data type
  • +
  • 'd' - 64-bit float (double) data type
  • +
+
[in]truncateControl truncation of floating point values to integers
+
+
+
Returns
0 on success, and -1 on failure.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ mstl3_resize_buffers()

+ +
+
+ + + + + +
+ + + + + + + +
int mstl3_resize_buffers (MS3TraceList * mstl)
+
+extern
+
+ +

Resize data sample buffers of MS3TraceList to what is needed.

+

This routine should only be used if pre-allocation of memory, via libmseed_prealloc_block_size, was enabled to allocate the buffers.

+
Parameters
+ + +
[in]mstlMS3TraceList to resize buffers
+
+
+
Returns
Return 0 on success, otherwise returns a libmseed error code.
+

MessageOnError - this function logs a message on error

+ +
+
+ +

◆ mstl3_pack()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
int64_t mstl3_pack (MS3TraceList * mstl,
void(*)(char *, int, void *) record_handler,
void * handlerdata,
int reclen,
int8_t encoding,
int64_t * packedsamples,
uint32_t flags,
int8_t verbose,
char * extra )
+
+extern
+
+ +

Pack MS3TraceList data into miniSEED records.

+

The datasamples array, numsamples and starttime fields of each trace segment will be adjusted as data are packed unless the MSF_MAINTAINMSTL flag is specified in flags. If MSF_MAINTAINMSTL is specified a caller would also normally set the MSF_FLUSHDATA flag to pack all data in the trace list.

+

Use as a rolling buffer to generate data records: The behavior of adjusting the trace list as data are packed is intended to allow using a MS3TraceList as an intermediate collection of data buffers to generate data records from an arbitrarily large data source, e.g. continuous data. In this pattern, data are added to a MS3TraceList and mstl3_pack() is called repeatedly. Data records are only produced if a complete record can be generated, which often leaves small amounts of data in each segment buffer. On completion or shutdown the caller usually makes a final call to mst3_pack() with the MSF_FLUSHDATA flag set to flush all data from the buffers.

+

As each record is filled and finished they are passed to record_handler() which should expect 1) a char* to the record, 2) the length of the record and 3) a pointer supplied by the original caller containing optional private data (handlerdata). It is the responsibility of record_handler() to process the record, the memory will be re-used or freed when record_handler() returns.

+

The requested encoding value is currently only used for integer data samples. The encoding is set automatially for text and floating point data samples as there is only a single encoding for them. A value of -1 can be used to request the default.

+

If extra is not NULL it is expected to contain extraheaders, a string containing (compact) JSON, that will be added to each output record.

+
Parameters
+ + + + + + + + + + +
[in]mstlMS3TraceList containing data to pack
[in]record_handler()Callback function called for each record
[in]handlerdataA pointer that will be provided to the record_handler()
[in]reclenMaximum record length to create
[in]encodingEncoding for data samples, see msr3_pack()
[out]packedsamplesThe number of samples packed, returned to caller
[in]flagsBit flags to control packing: +
[in]verboseControls logging verbosity, 0 is no diagnostic output
[in]extraIf not NULL, add this buffer of extra headers to all records
+
+
+
Returns
the number of records created on success and -1 on error.
+

MessageOnError - this function logs a message on error

+
See also
msr3_pack()
+ +
+
+ +

◆ mstl3_printtracelist()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
void mstl3_printtracelist (const MS3TraceList * mstl,
ms_timeformat_t timeformat,
int8_t details,
int8_t gaps,
int8_t versions )
+
+extern
+
+ +

Print trace list summary information for a MS3TraceList.

+

By default only print the source ID, starttime and endtime for each trace. If details is greater than 0 include the sample rate, number of samples and a total trace count. If gaps is greater than 0 and the previous trace matches (SID & samprate) include the gap between the endtime of the last trace and the starttime of the current trace.

+
Parameters
+ + + + + + +
[in]mstlMS3TraceList to print
[in]timeformatTime string format, one of ms_timeformat_t
[in]detailsFlag to control inclusion of more details
[in]gapsFlag to control inclusion of gap/overlap between segments
[in]versionsFlag to control inclusion of publication version on SourceIDs
+
+
+ +
+
+ +

◆ mstl3_printsynclist()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
void mstl3_printsynclist (const MS3TraceList * mstl,
const char * dccid,
ms_subseconds_t subseconds )
+
+extern
+
+ +

Print SYNC trace list summary information for a MS3TraceList.

+

The SYNC header line will be created using the supplied dccid, if the pointer is NULL the string "DCC" will be used instead.

+

If the subsecond flag is true the segment start and end times will include subsecond precision, otherwise they will be truncated to integer seconds.

+
Parameters
+ + + + +
[in]mstlMS3TraceList to print
[in]dccidThe DCC identifier to include in the output
[in]subsecondsInclusion of subseconds, one of ms_subseconds_t
+
+
+ +
+
+ +

◆ mstl3_printgaplist()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + + + + + + +
void mstl3_printgaplist (const MS3TraceList * mstl,
ms_timeformat_t timeformat,
double * mingap,
double * maxgap )
+
+extern
+
+ +

Print gap/overlap list summary information for a MS3TraceList.

+

Overlaps are printed as negative gaps.

+

If mingap and maxgap are not NULL their values will be enforced and only gaps/overlaps matching their implied criteria will be printed.

+
Parameters
+ + + + + +
[in]mstlMS3TraceList to print
[in]timeformatTime string format, one of ms_timeformat_t
[in]mingapMinimum gap to print in seconds (pointer to value)
[in]maxgapMaximum gap to print in seconds (pointer to value)
+
+
+ +
+
+
+ + + + + diff --git a/group__utility-functions.html b/group__utility-functions.html new file mode 100644 index 0000000..10f9833 --- /dev/null +++ b/group__utility-functions.html @@ -0,0 +1,515 @@ + + + + + + + +libmseed: General Utility Functions + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+ +
General Utility Functions
+
+
+ +

General utilities. +More...

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

+Functions

uint8_t ms_samplesize (char sampletype)
 Determine data sample size for each type.
 
int ms_encoding_sizetype (uint8_t encoding, uint8_t *samplesize, char *sampletype)
 Return sample size and/or type for given encoding value.
 
const char * ms_encodingstr (uint8_t encoding)
 Descriptive string for data encodings.
 
const char * ms_errorstr (int errorcode)
 Descriptive string for library Return codes.
 
nstime_t ms_sampletime (nstime_t time, int64_t offset, double samprate)
 Calculate the time of a sample in an array.
 
double ms_dabs (double val)
 Determine the absolute value of an input double.
 
int ms_bigendianhost (void)
 Runtime test for host endianess.
 
int64_t lmp_ftell64 (FILE *stream)
 
int lmp_fseek64 (FILE *stream, int64_t offset, int whence)
 
uint64_t lmp_nanosleep (uint64_t nanoseconds)
 
uint32_t ms_crc32c (const uint8_t *input, int length, uint32_t previousCRC32C)
 
+

Detailed Description

+

General utilities.

+

Function Documentation

+ +

◆ ms_samplesize()

+ +
+
+ + + + + +
+ + + + + + + +
uint8_t ms_samplesize (char sampletype)
+
+extern
+
+ +

Determine data sample size for each type.

+
Parameters
+ + +
[in]sampletypeLibrary sample type code:
    +
  • 't' - Text data type
  • +
  • 'i' - 32-bit integer data type
  • +
  • 'f' - 32-bit float data type
  • +
  • 'd' - 64-bit float (double) data type
  • +
+
+
+
+
Returns
The sample size based on type code or 0 for unknown.
+ +
+
+ +

◆ ms_encoding_sizetype()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int ms_encoding_sizetype (uint8_t encoding,
uint8_t * samplesize,
char * sampletype )
+
+extern
+
+ +

Return sample size and/or type for given encoding value.

+

Determine the decoded sample size and/or type based on data encoding. The samplesize and sampletype values will only be set if not NULL, allowing lookup of either value or both.

+
Parameters
+ + + + +
[in]encodingData sample encoding code
[out]samplesizeSize of sample, pointer that will be set
[out]sampletypeSample type, pointer to char that will be set
+
+
+
Returns
0 on success, -1 on error
+ +
+
+ +

◆ ms_encodingstr()

+ +
+
+ + + + + +
+ + + + + + + +
const char * ms_encodingstr (uint8_t encoding)
+
+extern
+
+ +

Descriptive string for data encodings.

+
Parameters
+ + +
[in]encodingData sample encoding code
+
+
+
Returns
a string describing a data encoding format
+ +
+
+ +

◆ ms_errorstr()

+ +
+
+ + + + + +
+ + + + + + + +
const char * ms_errorstr (int errorcode)
+
+extern
+
+ +

Descriptive string for library Return codes.

+
Parameters
+ + +
[in]errorcodeLibrary error code
+
+
+
Returns
a string describing the library error code or NULL if the code is unknown.
+ +
+
+ +

◆ ms_sampletime()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
nstime_t ms_sampletime (nstime_t time,
int64_t offset,
double samprate )
+
+extern
+
+ +

Calculate the time of a sample in an array.

+

Given a time, sample offset and sample rate/period calculate the time of the sample at the offset.

+

If samprate is negative the negated value is interpreted as a sample period in seconds, otherwise the value is assumed to be a sample rate in Hertz.

+

If leap seconds have been loaded into the internal library list: when a time span, from start to offset, completely contains a leap second, starts before and ends after, the calculated sample time will be adjusted (reduced) by one second.

Note
On the epoch time scale the value of a leap second is the same as the second following the leap second, without external information the values are ambiguous.
+
See also
ms_readleapsecondfile()
+
Parameters
+ + + + +
[in]timeTime value for first sample in array
[in]offsetOffset of sample to calculate time of
[in]samprateSample rate (when positive) or period (when negative)
+
+
+
Returns
Time of the sample at specified offset
+ +
+
+ +

◆ ms_dabs()

+ +
+
+ + + + + +
+ + + + + + + +
double ms_dabs (double val)
+
+extern
+
+ +

Determine the absolute value of an input double.

+

Actually just test if the input double is positive multiplying by -1.0 if not and return it.

+
Parameters
+ + +
[in]valValue for which to determine absolute value
+
+
+
Returns
the positive value of input double.
+ +
+
+ +

◆ ms_bigendianhost()

+ +
+
+ + + + + +
+ + + + + + + +
int ms_bigendianhost (void )
+
+externinline
+
+ +

Runtime test for host endianess.

+
Returns
0 if the host is little endian, otherwise 1.
+ +
+
+ +

◆ lmp_ftell64()

+ +
+
+ + + + + +
+ + + + + + + +
int64_t lmp_ftell64 (FILE * stream)
+
+extern
+
+

Portable version of POSIX ftello() to get file position in large files

+ +
+
+ +

◆ lmp_fseek64()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
int lmp_fseek64 (FILE * stream,
int64_t offset,
int whence )
+
+extern
+
+

Portable version of POSIX fseeko() to set position in large files

+ +
+
+ +

◆ lmp_nanosleep()

+ +
+
+ + + + + +
+ + + + + + + +
uint64_t lmp_nanosleep (uint64_t nanoseconds)
+
+extern
+
+

Portable version of POSIX nanosleep() to sleep for nanoseconds

+ +
+
+ +

◆ ms_crc32c()

+ +
+
+ + + + + +
+ + + + + + + + + + + + + + + + +
uint32_t ms_crc32c (const uint8_t * input,
int length,
uint32_t previousCRC32C )
+
+extern
+
+

Return CRC32C value of supplied buffer, with optional starting CRC32C value

+ +
+
+
+ + + + + diff --git a/index.html b/index.html new file mode 100644 index 0000000..476e5bf --- /dev/null +++ b/index.html @@ -0,0 +1,121 @@ + + + + + + + +libmseed: libmseed Documentation + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
libmseed Documentation
+
+
+

+Overview

+

The miniSEED library provides a framework for manipulation of miniSEED records, a format commonly used for seismological time series and related data. The library includes the functionality to read and write data records, in addition to reconstructing time series from multiple records.

+

The library should work in Unix-like, Windows and potentially other environments.

+

+Getting started

+

The Tutorial contains an overview of basic usage and examples to get you going.

+

The Capabilities page provides an overview the data format fundamentals and capabilities of the library.

+

+Downloading and installing

+

The releases area contains release versions.

+

For installation instructions see the INSTALL file.

+

+Development and issues

+

Please report issues to the project.

+

If you would like to contribute to the project please file Pull Requests and/or create issues for discussion at the libmseed project.

+

+Porting from earlier version of the library

+

A Guide for porting from earlier libmseed versions is available for developer porting software that previously used version 2 of the library.

+

+Versioning

+

Releases are versioned using Semantic Versioning.

+

+Acknowlegements

+

Numerous improvements have been incorporated based on feedback and patches submitted by others. Individual acknowlegements are included in the ChangeLog and/or commit messages. Contributions are welcome and greatly appreciated.

+

This library also uses code bits published in the public domain and acknowledgement is included in the code whenever possible.

+

+License

+

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this software except in compliance with the License. You may obtain a copy of the License at

+

http://www.apache.org/licenses/LICENSE-2.0

+

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

+

Copyright (C) 2024 Chad Trabant, EarthScope Data Services

+

Documentation last generated 2024-02-12

+
+ +
+ + + + + diff --git a/jquery.js b/jquery.js new file mode 100644 index 0000000..1dffb65 --- /dev/null +++ b/jquery.js @@ -0,0 +1,34 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",options:{classes:{},disabled:!1,create:null},_createWidget:function(t,e){e=y(e||this.defaultElement||this)[0],this.element=y(e),this.uuid=i++,this.eventNamespace="."+this.widgetName+this.uuid,this.bindings=y(),this.hoverable=y(),this.focusable=y(),this.classesElementLookup={},e!==this&&(y.data(e,this.widgetFullName,this),this._on(!0,this.element,{remove:function(t){t.target===e&&this.destroy()}}),this.document=y(e.style?e.ownerDocument:e.document||e),this.window=y(this.document[0].defaultView||this.document[0].parentWindow)),this.options=y.widget.extend({},this.options,this._getCreateOptions(),t),this._create(),this.options.disabled&&this._setOptionDisabled(this.options.disabled),this._trigger("create",null,this._getCreateEventData()),this._init()},_getCreateOptions:function(){return{}},_getCreateEventData:y.noop,_create:y.noop,_init:y.noop,destroy:function(){var i=this;this._destroy(),y.each(this.classesElementLookup,function(t,e){i._removeClass(e,t)}),this.element.off(this.eventNamespace).removeData(this.widgetFullName),this.widget().off(this.eventNamespace).removeAttr("aria-disabled"),this.bindings.off(this.eventNamespace)},_destroy:y.noop,widget:function(){return this.element},option:function(t,e){var i,s,n,o=t;if(0===arguments.length)return y.widget.extend({},this.options);if("string"==typeof t)if(o={},t=(i=t.split(".")).shift(),i.length){for(s=o[t]=y.widget.extend({},this.options[t]),n=0;n
"),i=e.children()[0];return y("body").append(e),t=i.offsetWidth,e.css("overflow","scroll"),t===(i=i.offsetWidth)&&(i=e[0].clientWidth),e.remove(),s=t-i},getScrollInfo:function(t){var e=t.isWindow||t.isDocument?"":t.element.css("overflow-x"),i=t.isWindow||t.isDocument?"":t.element.css("overflow-y"),e="scroll"===e||"auto"===e&&t.widthx(D(s),D(n))?o.important="horizontal":o.important="vertical",p.using.call(this,t,o)}),h.offset(y.extend(l,{using:t}))})},y.ui.position={fit:{left:function(t,e){var i=e.within,s=i.isWindow?i.scrollLeft:i.offset.left,n=i.width,o=t.left-e.collisionPosition.marginLeft,h=s-o,a=o+e.collisionWidth-n-s;e.collisionWidth>n?0n?0=this.options.distance},_mouseDelayMet:function(){return this.mouseDelayMet},_mouseStart:function(){},_mouseDrag:function(){},_mouseStop:function(){},_mouseCapture:function(){return!0}}),y.ui.plugin={add:function(t,e,i){var s,n=y.ui[t].prototype;for(s in i)n.plugins[s]=n.plugins[s]||[],n.plugins[s].push([e,i[s]])},call:function(t,e,i,s){var n,o=t.plugins[e];if(o&&(s||t.element[0].parentNode&&11!==t.element[0].parentNode.nodeType))for(n=0;n").css({overflow:"hidden",position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(),top:this.element.css("top"),left:this.element.css("left")})),this.element=this.element.parent().data("ui-resizable",this.element.resizable("instance")),this.elementIsWrapper=!0,t={marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom"),marginLeft:this.originalElement.css("marginLeft")},this.element.css(t),this.originalElement.css("margin",0),this.originalResizeStyle=this.originalElement.css("resize"),this.originalElement.css("resize","none"),this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"})),this.originalElement.css(t),this._proportionallyResize()),this._setupHandles(),e.autoHide&&y(this.element).on("mouseenter",function(){e.disabled||(i._removeClass("ui-resizable-autohide"),i._handles.show())}).on("mouseleave",function(){e.disabled||i.resizing||(i._addClass("ui-resizable-autohide"),i._handles.hide())}),this._mouseInit()},_destroy:function(){this._mouseDestroy(),this._addedHandles.remove();function t(t){y(t).removeData("resizable").removeData("ui-resizable").off(".resizable")}var e;return this.elementIsWrapper&&(t(this.element),e=this.element,this.originalElement.css({position:e.css("position"),width:e.outerWidth(),height:e.outerHeight(),top:e.css("top"),left:e.css("left")}).insertAfter(e),e.remove()),this.originalElement.css("resize",this.originalResizeStyle),t(this.originalElement),this},_setOption:function(t,e){switch(this._super(t,e),t){case"handles":this._removeHandles(),this._setupHandles();break;case"aspectRatio":this._aspectRatio=!!e}},_setupHandles:function(){var t,e,i,s,n,o=this.options,h=this;if(this.handles=o.handles||(y(".ui-resizable-handle",this.element).length?{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne",nw:".ui-resizable-nw"}:"e,s,se"),this._handles=y(),this._addedHandles=y(),this.handles.constructor===String)for("all"===this.handles&&(this.handles="n,e,s,w,se,sw,ne,nw"),i=this.handles.split(","),this.handles={},e=0;e"),this._addClass(n,"ui-resizable-handle "+s),n.css({zIndex:o.zIndex}),this.handles[t]=".ui-resizable-"+t,this.element.children(this.handles[t]).length||(this.element.append(n),this._addedHandles=this._addedHandles.add(n));this._renderAxis=function(t){var e,i,s;for(e in t=t||this.element,this.handles)this.handles[e].constructor===String?this.handles[e]=this.element.children(this.handles[e]).first().show():(this.handles[e].jquery||this.handles[e].nodeType)&&(this.handles[e]=y(this.handles[e]),this._on(this.handles[e],{mousedown:h._mouseDown})),this.elementIsWrapper&&this.originalElement[0].nodeName.match(/^(textarea|input|select|button)$/i)&&(i=y(this.handles[e],this.element),s=/sw|ne|nw|se|n|s/.test(e)?i.outerHeight():i.outerWidth(),i=["padding",/ne|nw|n/.test(e)?"Top":/se|sw|s/.test(e)?"Bottom":/^e$/.test(e)?"Right":"Left"].join(""),t.css(i,s),this._proportionallyResize()),this._handles=this._handles.add(this.handles[e])},this._renderAxis(this.element),this._handles=this._handles.add(this.element.find(".ui-resizable-handle")),this._handles.disableSelection(),this._handles.on("mouseover",function(){h.resizing||(this.className&&(n=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i)),h.axis=n&&n[1]?n[1]:"se")}),o.autoHide&&(this._handles.hide(),this._addClass("ui-resizable-autohide"))},_removeHandles:function(){this._addedHandles.remove()},_mouseCapture:function(t){var e,i,s=!1;for(e in this.handles)(i=y(this.handles[e])[0])!==t.target&&!y.contains(i,t.target)||(s=!0);return!this.options.disabled&&s},_mouseStart:function(t){var e,i,s=this.options,n=this.element;return this.resizing=!0,this._renderProxy(),e=this._num(this.helper.css("left")),i=this._num(this.helper.css("top")),s.containment&&(e+=y(s.containment).scrollLeft()||0,i+=y(s.containment).scrollTop()||0),this.offset=this.helper.offset(),this.position={left:e,top:i},this.size=this._helper?{width:this.helper.width(),height:this.helper.height()}:{width:n.width(),height:n.height()},this.originalSize=this._helper?{width:n.outerWidth(),height:n.outerHeight()}:{width:n.width(),height:n.height()},this.sizeDiff={width:n.outerWidth()-n.width(),height:n.outerHeight()-n.height()},this.originalPosition={left:e,top:i},this.originalMousePosition={left:t.pageX,top:t.pageY},this.aspectRatio="number"==typeof s.aspectRatio?s.aspectRatio:this.originalSize.width/this.originalSize.height||1,s=y(".ui-resizable-"+this.axis).css("cursor"),y("body").css("cursor","auto"===s?this.axis+"-resize":s),this._addClass("ui-resizable-resizing"),this._propagate("start",t),!0},_mouseDrag:function(t){var e=this.originalMousePosition,i=this.axis,s=t.pageX-e.left||0,e=t.pageY-e.top||0,i=this._change[i];return this._updatePrevProperties(),i&&(e=i.apply(this,[t,s,e]),this._updateVirtualBoundaries(t.shiftKey),(this._aspectRatio||t.shiftKey)&&(e=this._updateRatio(e,t)),e=this._respectSize(e,t),this._updateCache(e),this._propagate("resize",t),e=this._applyChanges(),!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize(),y.isEmptyObject(e)||(this._updatePrevProperties(),this._trigger("resize",t,this.ui()),this._applyChanges())),!1},_mouseStop:function(t){this.resizing=!1;var e,i,s,n=this.options,o=this;return this._helper&&(s=(e=(i=this._proportionallyResizeElements).length&&/textarea/i.test(i[0].nodeName))&&this._hasScroll(i[0],"left")?0:o.sizeDiff.height,i=e?0:o.sizeDiff.width,e={width:o.helper.width()-i,height:o.helper.height()-s},i=parseFloat(o.element.css("left"))+(o.position.left-o.originalPosition.left)||null,s=parseFloat(o.element.css("top"))+(o.position.top-o.originalPosition.top)||null,n.animate||this.element.css(y.extend(e,{top:s,left:i})),o.helper.height(o.size.height),o.helper.width(o.size.width),this._helper&&!n.animate&&this._proportionallyResize()),y("body").css("cursor","auto"),this._removeClass("ui-resizable-resizing"),this._propagate("stop",t),this._helper&&this.helper.remove(),!1},_updatePrevProperties:function(){this.prevPosition={top:this.position.top,left:this.position.left},this.prevSize={width:this.size.width,height:this.size.height}},_applyChanges:function(){var t={};return this.position.top!==this.prevPosition.top&&(t.top=this.position.top+"px"),this.position.left!==this.prevPosition.left&&(t.left=this.position.left+"px"),this.size.width!==this.prevSize.width&&(t.width=this.size.width+"px"),this.size.height!==this.prevSize.height&&(t.height=this.size.height+"px"),this.helper.css(t),t},_updateVirtualBoundaries:function(t){var e,i,s=this.options,n={minWidth:this._isNumber(s.minWidth)?s.minWidth:0,maxWidth:this._isNumber(s.maxWidth)?s.maxWidth:1/0,minHeight:this._isNumber(s.minHeight)?s.minHeight:0,maxHeight:this._isNumber(s.maxHeight)?s.maxHeight:1/0};(this._aspectRatio||t)&&(e=n.minHeight*this.aspectRatio,i=n.minWidth/this.aspectRatio,s=n.maxHeight*this.aspectRatio,t=n.maxWidth/this.aspectRatio,e>n.minWidth&&(n.minWidth=e),i>n.minHeight&&(n.minHeight=i),st.width,h=this._isNumber(t.height)&&e.minHeight&&e.minHeight>t.height,a=this.originalPosition.left+this.originalSize.width,r=this.originalPosition.top+this.originalSize.height,l=/sw|nw|w/.test(i),i=/nw|ne|n/.test(i);return o&&(t.width=e.minWidth),h&&(t.height=e.minHeight),s&&(t.width=e.maxWidth),n&&(t.height=e.maxHeight),o&&l&&(t.left=a-e.minWidth),s&&l&&(t.left=a-e.maxWidth),h&&i&&(t.top=r-e.minHeight),n&&i&&(t.top=r-e.maxHeight),t.width||t.height||t.left||!t.top?t.width||t.height||t.top||!t.left||(t.left=null):t.top=null,t},_getPaddingPlusBorderDimensions:function(t){for(var e=0,i=[],s=[t.css("borderTopWidth"),t.css("borderRightWidth"),t.css("borderBottomWidth"),t.css("borderLeftWidth")],n=[t.css("paddingTop"),t.css("paddingRight"),t.css("paddingBottom"),t.css("paddingLeft")];e<4;e++)i[e]=parseFloat(s[e])||0,i[e]+=parseFloat(n[e])||0;return{height:i[0]+i[2],width:i[1]+i[3]}},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var t,e=0,i=this.helper||this.element;e").css({overflow:"hidden"}),this._addClass(this.helper,this._helper),this.helper.css({width:this.element.outerWidth(),height:this.element.outerHeight(),position:"absolute",left:this.elementOffset.left+"px",top:this.elementOffset.top+"px",zIndex:++e.zIndex}),this.helper.appendTo("body").disableSelection()):this.helper=this.element},_change:{e:function(t,e){return{width:this.originalSize.width+e}},w:function(t,e){var i=this.originalSize;return{left:this.originalPosition.left+e,width:i.width-e}},n:function(t,e,i){var s=this.originalSize;return{top:this.originalPosition.top+i,height:s.height-i}},s:function(t,e,i){return{height:this.originalSize.height+i}},se:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},sw:function(t,e,i){return y.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[t,e,i]))},ne:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.e.apply(this,[t,e,i]))},nw:function(t,e,i){return y.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[t,e,i]))}},_propagate:function(t,e){y.ui.plugin.call(this,t,[e,this.ui()]),"resize"!==t&&this._trigger(t,e,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}}),y.ui.plugin.add("resizable","animate",{stop:function(e){var i=y(this).resizable("instance"),t=i.options,s=i._proportionallyResizeElements,n=s.length&&/textarea/i.test(s[0].nodeName),o=n&&i._hasScroll(s[0],"left")?0:i.sizeDiff.height,h=n?0:i.sizeDiff.width,n={width:i.size.width-h,height:i.size.height-o},h=parseFloat(i.element.css("left"))+(i.position.left-i.originalPosition.left)||null,o=parseFloat(i.element.css("top"))+(i.position.top-i.originalPosition.top)||null;i.element.animate(y.extend(n,o&&h?{top:o,left:h}:{}),{duration:t.animateDuration,easing:t.animateEasing,step:function(){var t={width:parseFloat(i.element.css("width")),height:parseFloat(i.element.css("height")),top:parseFloat(i.element.css("top")),left:parseFloat(i.element.css("left"))};s&&s.length&&y(s[0]).css({width:t.width,height:t.height}),i._updateCache(t),i._propagate("resize",e)}})}}),y.ui.plugin.add("resizable","containment",{start:function(){var i,s,n=y(this).resizable("instance"),t=n.options,e=n.element,o=t.containment,h=o instanceof y?o.get(0):/parent/.test(o)?e.parent().get(0):o;h&&(n.containerElement=y(h),/document/.test(o)||o===document?(n.containerOffset={left:0,top:0},n.containerPosition={left:0,top:0},n.parentData={element:y(document),left:0,top:0,width:y(document).width(),height:y(document).height()||document.body.parentNode.scrollHeight}):(i=y(h),s=[],y(["Top","Right","Left","Bottom"]).each(function(t,e){s[t]=n._num(i.css("padding"+e))}),n.containerOffset=i.offset(),n.containerPosition=i.position(),n.containerSize={height:i.innerHeight()-s[3],width:i.innerWidth()-s[1]},t=n.containerOffset,e=n.containerSize.height,o=n.containerSize.width,o=n._hasScroll(h,"left")?h.scrollWidth:o,e=n._hasScroll(h)?h.scrollHeight:e,n.parentData={element:h,left:t.left,top:t.top,width:o,height:e}))},resize:function(t){var e=y(this).resizable("instance"),i=e.options,s=e.containerOffset,n=e.position,o=e._aspectRatio||t.shiftKey,h={top:0,left:0},a=e.containerElement,t=!0;a[0]!==document&&/static/.test(a.css("position"))&&(h=s),n.left<(e._helper?s.left:0)&&(e.size.width=e.size.width+(e._helper?e.position.left-s.left:e.position.left-h.left),o&&(e.size.height=e.size.width/e.aspectRatio,t=!1),e.position.left=i.helper?s.left:0),n.top<(e._helper?s.top:0)&&(e.size.height=e.size.height+(e._helper?e.position.top-s.top:e.position.top),o&&(e.size.width=e.size.height*e.aspectRatio,t=!1),e.position.top=e._helper?s.top:0),i=e.containerElement.get(0)===e.element.parent().get(0),n=/relative|absolute/.test(e.containerElement.css("position")),i&&n?(e.offset.left=e.parentData.left+e.position.left,e.offset.top=e.parentData.top+e.position.top):(e.offset.left=e.element.offset().left,e.offset.top=e.element.offset().top),n=Math.abs(e.sizeDiff.width+(e._helper?e.offset.left-h.left:e.offset.left-s.left)),s=Math.abs(e.sizeDiff.height+(e._helper?e.offset.top-h.top:e.offset.top-s.top)),n+e.size.width>=e.parentData.width&&(e.size.width=e.parentData.width-n,o&&(e.size.height=e.size.width/e.aspectRatio,t=!1)),s+e.size.height>=e.parentData.height&&(e.size.height=e.parentData.height-s,o&&(e.size.width=e.size.height*e.aspectRatio,t=!1)),t||(e.position.left=e.prevPosition.left,e.position.top=e.prevPosition.top,e.size.width=e.prevSize.width,e.size.height=e.prevSize.height)},stop:function(){var t=y(this).resizable("instance"),e=t.options,i=t.containerOffset,s=t.containerPosition,n=t.containerElement,o=y(t.helper),h=o.offset(),a=o.outerWidth()-t.sizeDiff.width,o=o.outerHeight()-t.sizeDiff.height;t._helper&&!e.animate&&/relative/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o}),t._helper&&!e.animate&&/static/.test(n.css("position"))&&y(this).css({left:h.left-s.left-i.left,width:a,height:o})}}),y.ui.plugin.add("resizable","alsoResize",{start:function(){var t=y(this).resizable("instance").options;y(t.alsoResize).each(function(){var t=y(this);t.data("ui-resizable-alsoresize",{width:parseFloat(t.width()),height:parseFloat(t.height()),left:parseFloat(t.css("left")),top:parseFloat(t.css("top"))})})},resize:function(t,i){var e=y(this).resizable("instance"),s=e.options,n=e.originalSize,o=e.originalPosition,h={height:e.size.height-n.height||0,width:e.size.width-n.width||0,top:e.position.top-o.top||0,left:e.position.left-o.left||0};y(s.alsoResize).each(function(){var t=y(this),s=y(this).data("ui-resizable-alsoresize"),n={},e=t.parents(i.originalElement[0]).length?["width","height"]:["width","height","top","left"];y.each(e,function(t,e){var i=(s[e]||0)+(h[e]||0);i&&0<=i&&(n[e]=i||null)}),t.css(n)})},stop:function(){y(this).removeData("ui-resizable-alsoresize")}}),y.ui.plugin.add("resizable","ghost",{start:function(){var t=y(this).resizable("instance"),e=t.size;t.ghost=t.originalElement.clone(),t.ghost.css({opacity:.25,display:"block",position:"relative",height:e.height,width:e.width,margin:0,left:0,top:0}),t._addClass(t.ghost,"ui-resizable-ghost"),!1!==y.uiBackCompat&&"string"==typeof t.options.ghost&&t.ghost.addClass(this.options.ghost),t.ghost.appendTo(t.helper)},resize:function(){var t=y(this).resizable("instance");t.ghost&&t.ghost.css({position:"relative",height:t.size.height,width:t.size.width})},stop:function(){var t=y(this).resizable("instance");t.ghost&&t.helper&&t.helper.get(0).removeChild(t.ghost.get(0))}}),y.ui.plugin.add("resizable","grid",{resize:function(){var t,e=y(this).resizable("instance"),i=e.options,s=e.size,n=e.originalSize,o=e.originalPosition,h=e.axis,a="number"==typeof i.grid?[i.grid,i.grid]:i.grid,r=a[0]||1,l=a[1]||1,u=Math.round((s.width-n.width)/r)*r,p=Math.round((s.height-n.height)/l)*l,d=n.width+u,c=n.height+p,f=i.maxWidth&&i.maxWidthd,s=i.minHeight&&i.minHeight>c;i.grid=a,m&&(d+=r),s&&(c+=l),f&&(d-=r),g&&(c-=l),/^(se|s|e)$/.test(h)?(e.size.width=d,e.size.height=c):/^(ne)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.top=o.top-p):/^(sw)$/.test(h)?(e.size.width=d,e.size.height=c,e.position.left=o.left-u):((c-l<=0||d-r<=0)&&(t=e._getPaddingPlusBorderDimensions(this)),0=f[g]?0:Math.min(f[g],n));!a&&1-1){targetElements.on(evt+EVENT_NAMESPACE,function elementToggle(event){$.powerTip.toggle(this,event)})}else{targetElements.on(evt+EVENT_NAMESPACE,function elementOpen(event){$.powerTip.show(this,event)})}});$.each(options.closeEvents,function(idx,evt){if($.inArray(evt,options.openEvents)<0){targetElements.on(evt+EVENT_NAMESPACE,function elementClose(event){$.powerTip.hide(this,!isMouseEvent(event))})}});targetElements.on("keydown"+EVENT_NAMESPACE,function elementKeyDown(event){if(event.keyCode===27){$.powerTip.hide(this,true)}})}return targetElements};$.fn.powerTip.defaults={fadeInTime:200,fadeOutTime:100,followMouse:false,popupId:"powerTip",popupClass:null,intentSensitivity:7,intentPollInterval:100,closeDelay:100,placement:"n",smartPlacement:false,offset:10,mouseOnToPopup:false,manual:false,openEvents:["mouseenter","focus"],closeEvents:["mouseleave","blur"]};$.fn.powerTip.smartPlacementLists={n:["n","ne","nw","s"],e:["e","ne","se","w","nw","sw","n","s","e"],s:["s","se","sw","n"],w:["w","nw","sw","e","ne","se","n","s","w"],nw:["nw","w","sw","n","s","se","nw"],ne:["ne","e","se","n","s","sw","ne"],sw:["sw","w","nw","s","n","ne","sw"],se:["se","e","ne","s","n","nw","se"],"nw-alt":["nw-alt","n","ne-alt","sw-alt","s","se-alt","w","e"],"ne-alt":["ne-alt","n","nw-alt","se-alt","s","sw-alt","e","w"],"sw-alt":["sw-alt","s","se-alt","nw-alt","n","ne-alt","w","e"],"se-alt":["se-alt","s","sw-alt","ne-alt","n","nw-alt","e","w"]};$.powerTip={show:function apiShowTip(element,event){if(isMouseEvent(event)){trackMouse(event);session.previousX=event.pageX;session.previousY=event.pageY;$(element).data(DATA_DISPLAYCONTROLLER).show()}else{$(element).first().data(DATA_DISPLAYCONTROLLER).show(true,true)}return element},reposition:function apiResetPosition(element){$(element).first().data(DATA_DISPLAYCONTROLLER).resetPosition();return element},hide:function apiCloseTip(element,immediate){var displayController;immediate=element?immediate:true;if(element){displayController=$(element).first().data(DATA_DISPLAYCONTROLLER)}else if(session.activeHover){displayController=session.activeHover.data(DATA_DISPLAYCONTROLLER)}if(displayController){displayController.hide(immediate)}return element},toggle:function apiToggle(element,event){if(session.activeHover&&session.activeHover.is(element)){$.powerTip.hide(element,!isMouseEvent(event))}else{$.powerTip.show(element,event)}return element}};$.powerTip.showTip=$.powerTip.show;$.powerTip.closeTip=$.powerTip.hide;function CSSCoordinates(){var me=this;me.top="auto";me.left="auto";me.right="auto";me.bottom="auto";me.set=function(property,value){if($.isNumeric(value)){me[property]=Math.round(value)}}}function DisplayController(element,options,tipController){var hoverTimer=null,myCloseDelay=null;function openTooltip(immediate,forceOpen){cancelTimer();if(!element.data(DATA_HASACTIVEHOVER)){if(!immediate){session.tipOpenImminent=true;hoverTimer=setTimeout(function intentDelay(){hoverTimer=null;checkForIntent()},options.intentPollInterval)}else{if(forceOpen){element.data(DATA_FORCEDOPEN,true)}closeAnyDelayed();tipController.showTip(element)}}else{cancelClose()}}function closeTooltip(disableDelay){if(myCloseDelay){myCloseDelay=session.closeDelayTimeout=clearTimeout(myCloseDelay);session.delayInProgress=false}cancelTimer();session.tipOpenImminent=false;if(element.data(DATA_HASACTIVEHOVER)){element.data(DATA_FORCEDOPEN,false);if(!disableDelay){session.delayInProgress=true;session.closeDelayTimeout=setTimeout(function closeDelay(){session.closeDelayTimeout=null;tipController.hideTip(element);session.delayInProgress=false;myCloseDelay=null},options.closeDelay);myCloseDelay=session.closeDelayTimeout}else{tipController.hideTip(element)}}}function checkForIntent(){var xDifference=Math.abs(session.previousX-session.currentX),yDifference=Math.abs(session.previousY-session.currentY),totalDifference=xDifference+yDifference;if(totalDifference",{id:options.popupId});if($body.length===0){$body=$("body")}$body.append(tipElement);session.tooltips=session.tooltips?session.tooltips.add(tipElement):tipElement}if(options.followMouse){if(!tipElement.data(DATA_HASMOUSEMOVE)){$document.on("mousemove"+EVENT_NAMESPACE,positionTipOnCursor);$window.on("scroll"+EVENT_NAMESPACE,positionTipOnCursor);tipElement.data(DATA_HASMOUSEMOVE,true)}}function beginShowTip(element){element.data(DATA_HASACTIVEHOVER,true);tipElement.queue(function queueTipInit(next){showTip(element);next()})}function showTip(element){var tipContent;if(!element.data(DATA_HASACTIVEHOVER)){return}if(session.isTipOpen){if(!session.isClosing){hideTip(session.activeHover)}tipElement.delay(100).queue(function queueTipAgain(next){showTip(element);next()});return}element.trigger("powerTipPreRender");tipContent=getTooltipContent(element);if(tipContent){tipElement.empty().append(tipContent)}else{return}element.trigger("powerTipRender");session.activeHover=element;session.isTipOpen=true;tipElement.data(DATA_MOUSEONTOTIP,options.mouseOnToPopup);tipElement.addClass(options.popupClass);if(!options.followMouse||element.data(DATA_FORCEDOPEN)){positionTipOnElement(element);session.isFixedTipOpen=true}else{positionTipOnCursor()}if(!element.data(DATA_FORCEDOPEN)&&!options.followMouse){$document.on("click"+EVENT_NAMESPACE,function documentClick(event){var target=event.target;if(target!==element[0]){if(options.mouseOnToPopup){if(target!==tipElement[0]&&!$.contains(tipElement[0],target)){$.powerTip.hide()}}else{$.powerTip.hide()}}})}if(options.mouseOnToPopup&&!options.manual){tipElement.on("mouseenter"+EVENT_NAMESPACE,function tipMouseEnter(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).cancel()}});tipElement.on("mouseleave"+EVENT_NAMESPACE,function tipMouseLeave(){if(session.activeHover){session.activeHover.data(DATA_DISPLAYCONTROLLER).hide()}})}tipElement.fadeIn(options.fadeInTime,function fadeInCallback(){if(!session.desyncTimeout){session.desyncTimeout=setInterval(closeDesyncedTip,500)}element.trigger("powerTipOpen")})}function hideTip(element){session.isClosing=true;session.isTipOpen=false;session.desyncTimeout=clearInterval(session.desyncTimeout);element.data(DATA_HASACTIVEHOVER,false);element.data(DATA_FORCEDOPEN,false);$document.off("click"+EVENT_NAMESPACE);tipElement.off(EVENT_NAMESPACE);tipElement.fadeOut(options.fadeOutTime,function fadeOutCallback(){var coords=new CSSCoordinates;session.activeHover=null;session.isClosing=false;session.isFixedTipOpen=false;tipElement.removeClass();coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);tipElement.css(coords);element.trigger("powerTipClose")})}function positionTipOnCursor(){var tipWidth,tipHeight,coords,collisions,collisionCount;if(!session.isFixedTipOpen&&(session.isTipOpen||session.tipOpenImminent&&tipElement.data(DATA_HASMOUSEMOVE))){tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=new CSSCoordinates;coords.set("top",session.currentY+options.offset);coords.set("left",session.currentX+options.offset);collisions=getViewportCollisions(coords,tipWidth,tipHeight);if(collisions!==Collision.none){collisionCount=countFlags(collisions);if(collisionCount===1){if(collisions===Collision.right){coords.set("left",session.scrollLeft+session.windowWidth-tipWidth)}else if(collisions===Collision.bottom){coords.set("top",session.scrollTop+session.windowHeight-tipHeight)}}else{coords.set("left",session.currentX-tipWidth-options.offset);coords.set("top",session.currentY-tipHeight-options.offset)}}tipElement.css(coords)}}function positionTipOnElement(element){var priorityList,finalPlacement;if(options.smartPlacement||options.followMouse&&element.data(DATA_FORCEDOPEN)){priorityList=$.fn.powerTip.smartPlacementLists[options.placement];$.each(priorityList,function(idx,pos){var collisions=getViewportCollisions(placeTooltip(element,pos),tipElement.outerWidth(),tipElement.outerHeight());finalPlacement=pos;return collisions!==Collision.none})}else{placeTooltip(element,options.placement);finalPlacement=options.placement}tipElement.removeClass("w nw sw e ne se n s w se-alt sw-alt ne-alt nw-alt");tipElement.addClass(finalPlacement)}function placeTooltip(element,placement){var iterationCount=0,tipWidth,tipHeight,coords=new CSSCoordinates;coords.set("top",0);coords.set("left",0);tipElement.css(coords);do{tipWidth=tipElement.outerWidth();tipHeight=tipElement.outerHeight();coords=placementCalculator.compute(element,placement,tipWidth,tipHeight,options.offset);tipElement.css(coords)}while(++iterationCount<=5&&(tipWidth!==tipElement.outerWidth()||tipHeight!==tipElement.outerHeight()));return coords}function closeDesyncedTip(){var isDesynced=false,hasDesyncableCloseEvent=$.grep(["mouseleave","mouseout","blur","focusout"],function(eventType){return $.inArray(eventType,options.closeEvents)!==-1}).length>0;if(session.isTipOpen&&!session.isClosing&&!session.delayInProgress&&hasDesyncableCloseEvent){if(session.activeHover.data(DATA_HASACTIVEHOVER)===false||session.activeHover.is(":disabled")){isDesynced=true}else if(!isMouseOver(session.activeHover)&&!session.activeHover.is(":focus")&&!session.activeHover.data(DATA_FORCEDOPEN)){if(tipElement.data(DATA_MOUSEONTOTIP)){if(!isMouseOver(tipElement)){isDesynced=true}}else{isDesynced=true}}if(isDesynced){hideTip(session.activeHover)}}}this.showTip=beginShowTip;this.hideTip=hideTip;this.resetPosition=positionTipOnElement}function isSvgElement(element){return Boolean(window.SVGElement&&element[0]instanceof SVGElement)}function isMouseEvent(event){return Boolean(event&&$.inArray(event.type,MOUSE_EVENTS)>-1&&typeof event.pageX==="number")}function initTracking(){if(!session.mouseTrackingActive){session.mouseTrackingActive=true;getViewportDimensions();$(getViewportDimensions);$document.on("mousemove"+EVENT_NAMESPACE,trackMouse);$window.on("resize"+EVENT_NAMESPACE,trackResize);$window.on("scroll"+EVENT_NAMESPACE,trackScroll)}}function getViewportDimensions(){session.scrollLeft=$window.scrollLeft();session.scrollTop=$window.scrollTop();session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackResize(){session.windowWidth=$window.width();session.windowHeight=$window.height()}function trackScroll(){var x=$window.scrollLeft(),y=$window.scrollTop();if(x!==session.scrollLeft){session.currentX+=x-session.scrollLeft;session.scrollLeft=x}if(y!==session.scrollTop){session.currentY+=y-session.scrollTop;session.scrollTop=y}}function trackMouse(event){session.currentX=event.pageX;session.currentY=event.pageY}function isMouseOver(element){var elementPosition=element.offset(),elementBox=element[0].getBoundingClientRect(),elementWidth=elementBox.right-elementBox.left,elementHeight=elementBox.bottom-elementBox.top;return session.currentX>=elementPosition.left&&session.currentX<=elementPosition.left+elementWidth&&session.currentY>=elementPosition.top&&session.currentY<=elementPosition.top+elementHeight}function getTooltipContent(element){var tipText=element.data(DATA_POWERTIP),tipObject=element.data(DATA_POWERTIPJQ),tipTarget=element.data(DATA_POWERTIPTARGET),targetElement,content;if(tipText){if($.isFunction(tipText)){tipText=tipText.call(element[0])}content=tipText}else if(tipObject){if($.isFunction(tipObject)){tipObject=tipObject.call(element[0])}if(tipObject.length>0){content=tipObject.clone(true,true)}}else if(tipTarget){targetElement=$("#"+tipTarget);if(targetElement.length>0){content=targetElement.html()}}return content}function getViewportCollisions(coords,elementWidth,elementHeight){var viewportTop=session.scrollTop,viewportLeft=session.scrollLeft,viewportBottom=viewportTop+session.windowHeight,viewportRight=viewportLeft+session.windowWidth,collisions=Collision.none;if(coords.topviewportBottom||Math.abs(coords.bottom-session.windowHeight)>viewportBottom){collisions|=Collision.bottom}if(coords.leftviewportRight){collisions|=Collision.left}if(coords.left+elementWidth>viewportRight||coords.right1)){a.preventDefault();var c=a.originalEvent.changedTouches[0],d=document.createEvent("MouseEvents");d.initMouseEvent(b,!0,!0,window,1,c.screenX,c.screenY,c.clientX,c.clientY,!1,!1,!1,!1,0,null),a.target.dispatchEvent(d)}}if(a.support.touch="ontouchend"in document,a.support.touch){var e,b=a.ui.mouse.prototype,c=b._mouseInit,d=b._mouseDestroy;b._touchStart=function(a){var b=this;!e&&b._mouseCapture(a.originalEvent.changedTouches[0])&&(e=!0,b._touchMoved=!1,f(a,"mouseover"),f(a,"mousemove"),f(a,"mousedown"))},b._touchMove=function(a){e&&(this._touchMoved=!0,f(a,"mousemove"))},b._touchEnd=function(a){e&&(f(a,"mouseup"),f(a,"mouseout"),this._touchMoved||f(a,"click"),e=!1)},b._mouseInit=function(){var b=this;b.element.bind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),c.call(b)},b._mouseDestroy=function(){var b=this;b.element.unbind({touchstart:a.proxy(b,"_touchStart"),touchmove:a.proxy(b,"_touchMove"),touchend:a.proxy(b,"_touchEnd")}),d.call(b)}}}(jQuery);/*! SmartMenus jQuery Plugin - v1.1.0 - September 17, 2017 + * http://www.smartmenus.org/ + * Copyright Vasil Dinkov, Vadikom Web Ltd. http://vadikom.com; Licensed MIT */(function(t){"function"==typeof define&&define.amd?define(["jquery"],t):"object"==typeof module&&"object"==typeof module.exports?module.exports=t(require("jquery")):t(jQuery)})(function($){function initMouseDetection(t){var e=".smartmenus_mouse";if(mouseDetectionEnabled||t)mouseDetectionEnabled&&t&&($(document).off(e),mouseDetectionEnabled=!1);else{var i=!0,s=null,o={mousemove:function(t){var e={x:t.pageX,y:t.pageY,timeStamp:(new Date).getTime()};if(s){var o=Math.abs(s.x-e.x),a=Math.abs(s.y-e.y);if((o>0||a>0)&&2>=o&&2>=a&&300>=e.timeStamp-s.timeStamp&&(mouse=!0,i)){var n=$(t.target).closest("a");n.is("a")&&$.each(menuTrees,function(){return $.contains(this.$root[0],n[0])?(this.itemEnter({currentTarget:n[0]}),!1):void 0}),i=!1}}s=e}};o[touchEvents?"touchstart":"pointerover pointermove pointerout MSPointerOver MSPointerMove MSPointerOut"]=function(t){isTouchEvent(t.originalEvent)&&(mouse=!1)},$(document).on(getEventsNS(o,e)),mouseDetectionEnabled=!0}}function isTouchEvent(t){return!/^(4|mouse)$/.test(t.pointerType)}function getEventsNS(t,e){e||(e="");var i={};for(var s in t)i[s.split(" ").join(e+" ")+e]=t[s];return i}var menuTrees=[],mouse=!1,touchEvents="ontouchstart"in window,mouseDetectionEnabled=!1,requestAnimationFrame=window.requestAnimationFrame||function(t){return setTimeout(t,1e3/60)},cancelAnimationFrame=window.cancelAnimationFrame||function(t){clearTimeout(t)},canAnimate=!!$.fn.animate;return $.SmartMenus=function(t,e){this.$root=$(t),this.opts=e,this.rootId="",this.accessIdPrefix="",this.$subArrow=null,this.activatedItems=[],this.visibleSubMenus=[],this.showTimeout=0,this.hideTimeout=0,this.scrollTimeout=0,this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.idInc=0,this.$firstLink=null,this.$firstSub=null,this.disabled=!1,this.$disableOverlay=null,this.$touchScrollingSub=null,this.cssTransforms3d="perspective"in t.style||"webkitPerspective"in t.style,this.wasCollapsible=!1,this.init()},$.extend($.SmartMenus,{hideAll:function(){$.each(menuTrees,function(){this.menuHideAll()})},destroy:function(){for(;menuTrees.length;)menuTrees[0].destroy();initMouseDetection(!0)},prototype:{init:function(t){var e=this;if(!t){menuTrees.push(this),this.rootId=((new Date).getTime()+Math.random()+"").replace(/\D/g,""),this.accessIdPrefix="sm-"+this.rootId+"-",this.$root.hasClass("sm-rtl")&&(this.opts.rightToLeftSubMenus=!0);var i=".smartmenus";this.$root.data("smartmenus",this).attr("data-smartmenus-id",this.rootId).dataSM("level",1).on(getEventsNS({"mouseover focusin":$.proxy(this.rootOver,this),"mouseout focusout":$.proxy(this.rootOut,this),keydown:$.proxy(this.rootKeyDown,this)},i)).on(getEventsNS({mouseenter:$.proxy(this.itemEnter,this),mouseleave:$.proxy(this.itemLeave,this),mousedown:$.proxy(this.itemDown,this),focus:$.proxy(this.itemFocus,this),blur:$.proxy(this.itemBlur,this),click:$.proxy(this.itemClick,this)},i),"a"),i+=this.rootId,this.opts.hideOnClick&&$(document).on(getEventsNS({touchstart:$.proxy(this.docTouchStart,this),touchmove:$.proxy(this.docTouchMove,this),touchend:$.proxy(this.docTouchEnd,this),click:$.proxy(this.docClick,this)},i)),$(window).on(getEventsNS({"resize orientationchange":$.proxy(this.winResize,this)},i)),this.opts.subIndicators&&(this.$subArrow=$("").addClass("sub-arrow"),this.opts.subIndicatorsText&&this.$subArrow.html(this.opts.subIndicatorsText)),initMouseDetection()}if(this.$firstSub=this.$root.find("ul").each(function(){e.menuInit($(this))}).eq(0),this.$firstLink=this.$root.find("a").eq(0),this.opts.markCurrentItem){var s=/(index|default)\.[^#\?\/]*/i,o=/#.*/,a=window.location.href.replace(s,""),n=a.replace(o,"");this.$root.find("a").each(function(){var t=this.href.replace(s,""),i=$(this);(t==a||t==n)&&(i.addClass("current"),e.opts.markCurrentTree&&i.parentsUntil("[data-smartmenus-id]","ul").each(function(){$(this).dataSM("parent-a").addClass("current")}))})}this.wasCollapsible=this.isCollapsible()},destroy:function(t){if(!t){var e=".smartmenus";this.$root.removeData("smartmenus").removeAttr("data-smartmenus-id").removeDataSM("level").off(e),e+=this.rootId,$(document).off(e),$(window).off(e),this.opts.subIndicators&&(this.$subArrow=null)}this.menuHideAll();var i=this;this.$root.find("ul").each(function(){var t=$(this);t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.dataSM("shown-before")&&((i.opts.subMenusMinWidth||i.opts.subMenusMaxWidth)&&t.css({width:"",minWidth:"",maxWidth:""}).removeClass("sm-nowrap"),t.dataSM("scroll-arrows")&&t.dataSM("scroll-arrows").remove(),t.css({zIndex:"",top:"",left:"",marginLeft:"",marginTop:"",display:""})),0==(t.attr("id")||"").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeDataSM("in-mega").removeDataSM("shown-before").removeDataSM("scroll-arrows").removeDataSM("parent-a").removeDataSM("level").removeDataSM("beforefirstshowfired").removeAttr("role").removeAttr("aria-hidden").removeAttr("aria-labelledby").removeAttr("aria-expanded"),this.$root.find("a.has-submenu").each(function(){var t=$(this);0==t.attr("id").indexOf(i.accessIdPrefix)&&t.removeAttr("id")}).removeClass("has-submenu").removeDataSM("sub").removeAttr("aria-haspopup").removeAttr("aria-controls").removeAttr("aria-expanded").closest("li").removeDataSM("sub"),this.opts.subIndicators&&this.$root.find("span.sub-arrow").remove(),this.opts.markCurrentItem&&this.$root.find("a.current").removeClass("current"),t||(this.$root=null,this.$firstLink=null,this.$firstSub=null,this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),menuTrees.splice($.inArray(this,menuTrees),1))},disable:function(t){if(!this.disabled){if(this.menuHideAll(),!t&&!this.opts.isPopup&&this.$root.is(":visible")){var e=this.$root.offset();this.$disableOverlay=$('
').css({position:"absolute",top:e.top,left:e.left,width:this.$root.outerWidth(),height:this.$root.outerHeight(),zIndex:this.getStartZIndex(!0),opacity:0}).appendTo(document.body)}this.disabled=!0}},docClick:function(t){return this.$touchScrollingSub?(this.$touchScrollingSub=null,void 0):((this.visibleSubMenus.length&&!$.contains(this.$root[0],t.target)||$(t.target).closest("a").length)&&this.menuHideAll(),void 0)},docTouchEnd:function(){if(this.lastTouch){if(!(!this.visibleSubMenus.length||void 0!==this.lastTouch.x2&&this.lastTouch.x1!=this.lastTouch.x2||void 0!==this.lastTouch.y2&&this.lastTouch.y1!=this.lastTouch.y2||this.lastTouch.target&&$.contains(this.$root[0],this.lastTouch.target))){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var t=this;this.hideTimeout=setTimeout(function(){t.menuHideAll()},350)}this.lastTouch=null}},docTouchMove:function(t){if(this.lastTouch){var e=t.originalEvent.touches[0];this.lastTouch.x2=e.pageX,this.lastTouch.y2=e.pageY}},docTouchStart:function(t){var e=t.originalEvent.touches[0];this.lastTouch={x1:e.pageX,y1:e.pageY,target:e.target}},enable:function(){this.disabled&&(this.$disableOverlay&&(this.$disableOverlay.remove(),this.$disableOverlay=null),this.disabled=!1)},getClosestMenu:function(t){for(var e=$(t).closest("ul");e.dataSM("in-mega");)e=e.parent().closest("ul");return e[0]||null},getHeight:function(t){return this.getOffset(t,!0)},getOffset:function(t,e){var i;"none"==t.css("display")&&(i={position:t[0].style.position,visibility:t[0].style.visibility},t.css({position:"absolute",visibility:"hidden"}).show());var s=t[0].getBoundingClientRect&&t[0].getBoundingClientRect(),o=s&&(e?s.height||s.bottom-s.top:s.width||s.right-s.left);return o||0===o||(o=e?t[0].offsetHeight:t[0].offsetWidth),i&&t.hide().css(i),o},getStartZIndex:function(t){var e=parseInt(this[t?"$root":"$firstSub"].css("z-index"));return!t&&isNaN(e)&&(e=parseInt(this.$root.css("z-index"))),isNaN(e)?1:e},getTouchPoint:function(t){return t.touches&&t.touches[0]||t.changedTouches&&t.changedTouches[0]||t},getViewport:function(t){var e=t?"Height":"Width",i=document.documentElement["client"+e],s=window["inner"+e];return s&&(i=Math.min(i,s)),i},getViewportHeight:function(){return this.getViewport(!0)},getViewportWidth:function(){return this.getViewport()},getWidth:function(t){return this.getOffset(t)},handleEvents:function(){return!this.disabled&&this.isCSSOn()},handleItemEvents:function(t){return this.handleEvents()&&!this.isLinkInMegaMenu(t)},isCollapsible:function(){return"static"==this.$firstSub.css("position")},isCSSOn:function(){return"inline"!=this.$firstLink.css("display")},isFixed:function(){var t="fixed"==this.$root.css("position");return t||this.$root.parentsUntil("body").each(function(){return"fixed"==$(this).css("position")?(t=!0,!1):void 0}),t},isLinkInMegaMenu:function(t){return $(this.getClosestMenu(t[0])).hasClass("mega-menu")},isTouchMode:function(){return!mouse||this.opts.noMouseOver||this.isCollapsible()},itemActivate:function(t,e){var i=t.closest("ul"),s=i.dataSM("level");if(s>1&&(!this.activatedItems[s-2]||this.activatedItems[s-2][0]!=i.dataSM("parent-a")[0])){var o=this;$(i.parentsUntil("[data-smartmenus-id]","ul").get().reverse()).add(i).each(function(){o.itemActivate($(this).dataSM("parent-a"))})}if((!this.isCollapsible()||e)&&this.menuHideSubMenus(this.activatedItems[s-1]&&this.activatedItems[s-1][0]==t[0]?s:s-1),this.activatedItems[s-1]=t,this.$root.triggerHandler("activate.smapi",t[0])!==!1){var a=t.dataSM("sub");a&&(this.isTouchMode()||!this.opts.showOnClick||this.clickActivated)&&this.menuShow(a)}},itemBlur:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&this.$root.triggerHandler("blur.smapi",e[0])},itemClick:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(this.$touchScrollingSub&&this.$touchScrollingSub[0]==e.closest("ul")[0])return this.$touchScrollingSub=null,t.stopPropagation(),!1;if(this.$root.triggerHandler("click.smapi",e[0])===!1)return!1;var i=$(t.target).is(".sub-arrow"),s=e.dataSM("sub"),o=s?2==s.dataSM("level"):!1,a=this.isCollapsible(),n=/toggle$/.test(this.opts.collapsibleBehavior),r=/link$/.test(this.opts.collapsibleBehavior),h=/^accordion/.test(this.opts.collapsibleBehavior);if(s&&!s.is(":visible")){if((!r||!a||i)&&(this.opts.showOnClick&&o&&(this.clickActivated=!0),this.itemActivate(e,h),s.is(":visible")))return this.focusActivated=!0,!1}else if(a&&(n||i))return this.itemActivate(e,h),this.menuHide(s),n&&(this.focusActivated=!1),!1;return this.opts.showOnClick&&o||e.hasClass("disabled")||this.$root.triggerHandler("select.smapi",e[0])===!1?!1:void 0}},itemDown:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&e.dataSM("mousedown",!0)},itemEnter:function(t){var e=$(t.currentTarget);if(this.handleItemEvents(e)){if(!this.isTouchMode()){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);var i=this;this.showTimeout=setTimeout(function(){i.itemActivate(e)},this.opts.showOnClick&&1==e.closest("ul").dataSM("level")?1:this.opts.showTimeout)}this.$root.triggerHandler("mouseenter.smapi",e[0])}},itemFocus:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(!this.focusActivated||this.isTouchMode()&&e.dataSM("mousedown")||this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0]==e[0]||this.itemActivate(e,!0),this.$root.triggerHandler("focus.smapi",e[0]))},itemLeave:function(t){var e=$(t.currentTarget);this.handleItemEvents(e)&&(this.isTouchMode()||(e[0].blur(),this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0)),e.removeDataSM("mousedown"),this.$root.triggerHandler("mouseleave.smapi",e[0]))},menuHide:function(t){if(this.$root.triggerHandler("beforehide.smapi",t[0])!==!1&&(canAnimate&&t.stop(!0,!0),"none"!=t.css("display"))){var e=function(){t.css("z-index","")};this.isCollapsible()?canAnimate&&this.opts.collapsibleHideFunction?this.opts.collapsibleHideFunction.call(this,t,e):t.hide(this.opts.collapsibleHideDuration,e):canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,t,e):t.hide(this.opts.hideDuration,e),t.dataSM("scroll")&&(this.menuScrollStop(t),t.css({"touch-action":"","-ms-touch-action":"","-webkit-transform":"",transform:""}).off(".smartmenus_scroll").removeDataSM("scroll").dataSM("scroll-arrows").hide()),t.dataSM("parent-a").removeClass("highlighted").attr("aria-expanded","false"),t.attr({"aria-expanded":"false","aria-hidden":"true"});var i=t.dataSM("level");this.activatedItems.splice(i-1,1),this.visibleSubMenus.splice($.inArray(t,this.visibleSubMenus),1),this.$root.triggerHandler("hide.smapi",t[0])}},menuHideAll:function(){this.showTimeout&&(clearTimeout(this.showTimeout),this.showTimeout=0);for(var t=this.opts.isPopup?1:0,e=this.visibleSubMenus.length-1;e>=t;e--)this.menuHide(this.visibleSubMenus[e]);this.opts.isPopup&&(canAnimate&&this.$root.stop(!0,!0),this.$root.is(":visible")&&(canAnimate&&this.opts.hideFunction?this.opts.hideFunction.call(this,this.$root):this.$root.hide(this.opts.hideDuration))),this.activatedItems=[],this.visibleSubMenus=[],this.clickActivated=!1,this.focusActivated=!1,this.zIndexInc=0,this.$root.triggerHandler("hideAll.smapi")},menuHideSubMenus:function(t){for(var e=this.activatedItems.length-1;e>=t;e--){var i=this.activatedItems[e].dataSM("sub");i&&this.menuHide(i)}},menuInit:function(t){if(!t.dataSM("in-mega")){t.hasClass("mega-menu")&&t.find("ul").dataSM("in-mega",!0);for(var e=2,i=t[0];(i=i.parentNode.parentNode)!=this.$root[0];)e++;var s=t.prevAll("a").eq(-1);s.length||(s=t.prevAll().find("a").eq(-1)),s.addClass("has-submenu").dataSM("sub",t),t.dataSM("parent-a",s).dataSM("level",e).parent().dataSM("sub",t);var o=s.attr("id")||this.accessIdPrefix+ ++this.idInc,a=t.attr("id")||this.accessIdPrefix+ ++this.idInc;s.attr({id:o,"aria-haspopup":"true","aria-controls":a,"aria-expanded":"false"}),t.attr({id:a,role:"group","aria-hidden":"true","aria-labelledby":o,"aria-expanded":"false"}),this.opts.subIndicators&&s[this.opts.subIndicatorsPos](this.$subArrow.clone())}},menuPosition:function(t){var e,i,s=t.dataSM("parent-a"),o=s.closest("li"),a=o.parent(),n=t.dataSM("level"),r=this.getWidth(t),h=this.getHeight(t),u=s.offset(),l=u.left,c=u.top,d=this.getWidth(s),m=this.getHeight(s),p=$(window),f=p.scrollLeft(),v=p.scrollTop(),b=this.getViewportWidth(),S=this.getViewportHeight(),g=a.parent().is("[data-sm-horizontal-sub]")||2==n&&!a.hasClass("sm-vertical"),M=this.opts.rightToLeftSubMenus&&!o.is("[data-sm-reverse]")||!this.opts.rightToLeftSubMenus&&o.is("[data-sm-reverse]"),w=2==n?this.opts.mainMenuSubOffsetX:this.opts.subMenusSubOffsetX,T=2==n?this.opts.mainMenuSubOffsetY:this.opts.subMenusSubOffsetY;if(g?(e=M?d-r-w:w,i=this.opts.bottomToTopSubMenus?-h-T:m+T):(e=M?w-r:d-w,i=this.opts.bottomToTopSubMenus?m-T-h:T),this.opts.keepInViewport){var y=l+e,I=c+i;if(M&&f>y?e=g?f-y+e:d-w:!M&&y+r>f+b&&(e=g?f+b-r-y+e:w-r),g||(S>h&&I+h>v+S?i+=v+S-h-I:(h>=S||v>I)&&(i+=v-I)),g&&(I+h>v+S+.49||v>I)||!g&&h>S+.49){var x=this;t.dataSM("scroll-arrows")||t.dataSM("scroll-arrows",$([$('')[0],$('')[0]]).on({mouseenter:function(){t.dataSM("scroll").up=$(this).hasClass("scroll-up"),x.menuScroll(t)},mouseleave:function(e){x.menuScrollStop(t),x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(t){t.preventDefault()}}).insertAfter(t));var A=".smartmenus_scroll";if(t.dataSM("scroll",{y:this.cssTransforms3d?0:i-m,step:1,itemH:m,subH:h,arrowDownH:this.getHeight(t.dataSM("scroll-arrows").eq(1))}).on(getEventsNS({mouseover:function(e){x.menuScrollOver(t,e)},mouseout:function(e){x.menuScrollOut(t,e)},"mousewheel DOMMouseScroll":function(e){x.menuScrollMousewheel(t,e)}},A)).dataSM("scroll-arrows").css({top:"auto",left:"0",marginLeft:e+(parseInt(t.css("border-left-width"))||0),width:r-(parseInt(t.css("border-left-width"))||0)-(parseInt(t.css("border-right-width"))||0),zIndex:t.css("z-index")}).eq(g&&this.opts.bottomToTopSubMenus?0:1).show(),this.isFixed()){var C={};C[touchEvents?"touchstart touchmove touchend":"pointerdown pointermove pointerup MSPointerDown MSPointerMove MSPointerUp"]=function(e){x.menuScrollTouch(t,e)},t.css({"touch-action":"none","-ms-touch-action":"none"}).on(getEventsNS(C,A))}}}t.css({top:"auto",left:"0",marginLeft:e,marginTop:i-m})},menuScroll:function(t,e,i){var s,o=t.dataSM("scroll"),a=t.dataSM("scroll-arrows"),n=o.up?o.upEnd:o.downEnd;if(!e&&o.momentum){if(o.momentum*=.92,s=o.momentum,.5>s)return this.menuScrollStop(t),void 0}else s=i||(e||!this.opts.scrollAccelerate?this.opts.scrollStep:Math.floor(o.step));var r=t.dataSM("level");if(this.activatedItems[r-1]&&this.activatedItems[r-1].dataSM("sub")&&this.activatedItems[r-1].dataSM("sub").is(":visible")&&this.menuHideSubMenus(r-1),o.y=o.up&&o.y>=n||!o.up&&n>=o.y?o.y:Math.abs(n-o.y)>s?o.y+(o.up?s:-s):n,t.css(this.cssTransforms3d?{"-webkit-transform":"translate3d(0, "+o.y+"px, 0)",transform:"translate3d(0, "+o.y+"px, 0)"}:{marginTop:o.y}),mouse&&(o.up&&o.y>o.downEnd||!o.up&&o.y0;t.dataSM("scroll-arrows").eq(i?0:1).is(":visible")&&(t.dataSM("scroll").up=i,this.menuScroll(t,!0))}e.preventDefault()},menuScrollOut:function(t,e){mouse&&(/^scroll-(up|down)/.test((e.relatedTarget||"").className)||(t[0]==e.relatedTarget||$.contains(t[0],e.relatedTarget))&&this.getClosestMenu(e.relatedTarget)==t[0]||t.dataSM("scroll-arrows").css("visibility","hidden"))},menuScrollOver:function(t,e){if(mouse&&!/^scroll-(up|down)/.test(e.target.className)&&this.getClosestMenu(e.target)==t[0]){this.menuScrollRefreshData(t);var i=t.dataSM("scroll"),s=$(window).scrollTop()-t.dataSM("parent-a").offset().top-i.itemH;t.dataSM("scroll-arrows").eq(0).css("margin-top",s).end().eq(1).css("margin-top",s+this.getViewportHeight()-i.arrowDownH).end().css("visibility","visible")}},menuScrollRefreshData:function(t){var e=t.dataSM("scroll"),i=$(window).scrollTop()-t.dataSM("parent-a").offset().top-e.itemH;this.cssTransforms3d&&(i=-(parseFloat(t.css("margin-top"))-i)),$.extend(e,{upEnd:i,downEnd:i+this.getViewportHeight()-e.subH})},menuScrollStop:function(t){return this.scrollTimeout?(cancelAnimationFrame(this.scrollTimeout),this.scrollTimeout=0,t.dataSM("scroll").step=1,!0):void 0},menuScrollTouch:function(t,e){if(e=e.originalEvent,isTouchEvent(e)){var i=this.getTouchPoint(e);if(this.getClosestMenu(i.target)==t[0]){var s=t.dataSM("scroll");if(/(start|down)$/i.test(e.type))this.menuScrollStop(t)?(e.preventDefault(),this.$touchScrollingSub=t):this.$touchScrollingSub=null,this.menuScrollRefreshData(t),$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp});else if(/move$/i.test(e.type)){var o=void 0!==s.touchY?s.touchY:s.touchStartY;if(void 0!==o&&o!=i.pageY){this.$touchScrollingSub=t;var a=i.pageY>o;void 0!==s.up&&s.up!=a&&$.extend(s,{touchStartY:i.pageY,touchStartTime:e.timeStamp}),$.extend(s,{up:a,touchY:i.pageY}),this.menuScroll(t,!0,Math.abs(i.pageY-o))}e.preventDefault()}else void 0!==s.touchY&&((s.momentum=15*Math.pow(Math.abs(i.pageY-s.touchStartY)/(e.timeStamp-s.touchStartTime),2))&&(this.menuScrollStop(t),this.menuScroll(t),e.preventDefault()),delete s.touchY)}}},menuShow:function(t){if((t.dataSM("beforefirstshowfired")||(t.dataSM("beforefirstshowfired",!0),this.$root.triggerHandler("beforefirstshow.smapi",t[0])!==!1))&&this.$root.triggerHandler("beforeshow.smapi",t[0])!==!1&&(t.dataSM("shown-before",!0),canAnimate&&t.stop(!0,!0),!t.is(":visible"))){var e=t.dataSM("parent-a"),i=this.isCollapsible();if((this.opts.keepHighlighted||i)&&e.addClass("highlighted"),i)t.removeClass("sm-nowrap").css({zIndex:"",width:"auto",minWidth:"",maxWidth:"",top:"",left:"",marginLeft:"",marginTop:""});else{if(t.css("z-index",this.zIndexInc=(this.zIndexInc||this.getStartZIndex())+1),(this.opts.subMenusMinWidth||this.opts.subMenusMaxWidth)&&(t.css({width:"auto",minWidth:"",maxWidth:""}).addClass("sm-nowrap"),this.opts.subMenusMinWidth&&t.css("min-width",this.opts.subMenusMinWidth),this.opts.subMenusMaxWidth)){var s=this.getWidth(t);t.css("max-width",this.opts.subMenusMaxWidth),s>this.getWidth(t)&&t.removeClass("sm-nowrap").css("width",this.opts.subMenusMaxWidth)}this.menuPosition(t)}var o=function(){t.css("overflow","")};i?canAnimate&&this.opts.collapsibleShowFunction?this.opts.collapsibleShowFunction.call(this,t,o):t.show(this.opts.collapsibleShowDuration,o):canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,t,o):t.show(this.opts.showDuration,o),e.attr("aria-expanded","true"),t.attr({"aria-expanded":"true","aria-hidden":"false"}),this.visibleSubMenus.push(t),this.$root.triggerHandler("show.smapi",t[0])}},popupHide:function(t){this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0);var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},t?1:this.opts.hideTimeout)},popupShow:function(t,e){if(!this.opts.isPopup)return alert('SmartMenus jQuery Error:\n\nIf you want to show this menu via the "popupShow" method, set the isPopup:true option.'),void 0;if(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),this.$root.dataSM("shown-before",!0),canAnimate&&this.$root.stop(!0,!0),!this.$root.is(":visible")){this.$root.css({left:t,top:e});var i=this,s=function(){i.$root.css("overflow","")};canAnimate&&this.opts.showFunction?this.opts.showFunction.call(this,this.$root,s):this.$root.show(this.opts.showDuration,s),this.visibleSubMenus[0]=this.$root}},refresh:function(){this.destroy(!0),this.init(!0)},rootKeyDown:function(t){if(this.handleEvents())switch(t.keyCode){case 27:var e=this.activatedItems[0];if(e){this.menuHideAll(),e[0].focus();var i=e.dataSM("sub");i&&this.menuHide(i)}break;case 32:var s=$(t.target);if(s.is("a")&&this.handleItemEvents(s)){var i=s.dataSM("sub");i&&!i.is(":visible")&&(this.itemClick({currentTarget:t.target}),t.preventDefault())}}},rootOut:function(t){if(this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&(this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0),!this.opts.showOnClick||!this.opts.hideOnClick)){var e=this;this.hideTimeout=setTimeout(function(){e.menuHideAll()},this.opts.hideTimeout)}},rootOver:function(t){this.handleEvents()&&!this.isTouchMode()&&t.target!=this.$root[0]&&this.hideTimeout&&(clearTimeout(this.hideTimeout),this.hideTimeout=0)},winResize:function(t){if(this.handleEvents()){if(!("onorientationchange"in window)||"orientationchange"==t.type){var e=this.isCollapsible();this.wasCollapsible&&e||(this.activatedItems.length&&this.activatedItems[this.activatedItems.length-1][0].blur(),this.menuHideAll()),this.wasCollapsible=e}}else if(this.$disableOverlay){var i=this.$root.offset();this.$disableOverlay.css({top:i.top,left:i.left,width:this.$root.outerWidth(),height:this.$root.outerHeight()})}}}}),$.fn.dataSM=function(t,e){return e?this.data(t+"_smartmenus",e):this.data(t+"_smartmenus")},$.fn.removeDataSM=function(t){return this.removeData(t+"_smartmenus")},$.fn.smartmenus=function(options){if("string"==typeof options){var args=arguments,method=options;return Array.prototype.shift.call(args),this.each(function(){var t=$(this).data("smartmenus");t&&t[method]&&t[method].apply(t,args)})}return this.each(function(){var dataOpts=$(this).data("sm-options")||null;if(dataOpts)try{dataOpts=eval("("+dataOpts+")")}catch(e){dataOpts=null,alert('ERROR\n\nSmartMenus jQuery init:\nInvalid "data-sm-options" attribute value syntax.')}new $.SmartMenus(this,$.extend({},$.fn.smartmenus.defaults,options,dataOpts))})},$.fn.smartmenus.defaults={isPopup:!1,mainMenuSubOffsetX:0,mainMenuSubOffsetY:0,subMenusSubOffsetX:0,subMenusSubOffsetY:0,subMenusMinWidth:"10em",subMenusMaxWidth:"20em",subIndicators:!0,subIndicatorsPos:"append",subIndicatorsText:"",scrollStep:30,scrollAccelerate:!0,showTimeout:250,hideTimeout:500,showDuration:0,showFunction:null,hideDuration:0,hideFunction:function(t,e){t.fadeOut(200,e)},collapsibleShowDuration:0,collapsibleShowFunction:function(t,e){t.slideDown(200,e)},collapsibleHideDuration:0,collapsibleHideFunction:function(t,e){t.slideUp(200,e)},showOnClick:!1,hideOnClick:!0,noMouseOver:!1,keepInViewport:!0,keepHighlighted:!0,markCurrentItem:!1,markCurrentTree:!0,rightToLeftSubMenus:!1,bottomToTopSubMenus:!1,collapsibleBehavior:"default"},$}); \ No newline at end of file diff --git a/libmseed_8h.html b/libmseed_8h.html new file mode 100644 index 0000000..fe1521e --- /dev/null +++ b/libmseed_8h.html @@ -0,0 +1,86 @@ + + + + + + + +libmseed: libmseed.h File Reference + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + + +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
+
libmseed.h File Reference
+
+
+
+ + + + + diff --git a/libmseed_8h_source.html b/libmseed_8h_source.html new file mode 100644 index 0000000..72ffd2c --- /dev/null +++ b/libmseed_8h_source.html @@ -0,0 +1,1218 @@ + + + + + + + +libmseed: libmseed.h Source File + + + + + + + + + + + + +
+
+ + + + + + +
+
libmseed 3.1.1 +
+
The miniSEED data format library
+
+
+ + + + + + + + +
+ +
+
+ + +
+
+
+
+
+
Loading...
+
Searching...
+
No Matches
+
+
+
+
+ +
+
libmseed.h
+
+
+Go to the documentation of this file.
1/**********************************************************************/
+
24#ifndef LIBMSEED_H
+
25#define LIBMSEED_H 1
+
26
+
27#ifdef __cplusplus
+
28extern "C" {
+
29#endif
+
30
+
31#define LIBMSEED_VERSION "3.1.1"
+
32#define LIBMSEED_RELEASE "2024.024"
+
33
+
59/* C99 standard headers */
+
60#include <stdlib.h>
+
61#include <stdio.h>
+
62#include <stdarg.h>
+
63#include <time.h>
+
64#include <string.h>
+
65#include <ctype.h>
+
66
+
69#define PRIsize_t "zu"
+
70
+
71#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
+
72 #define LMP_WIN 1
+
73#endif
+
74
+
75/* Set platform specific features, Windows versus everything else */
+
76#if defined(LMP_WIN)
+
77 #include <windows.h>
+
78 #include <sys/types.h>
+
79
+
80 /* Re-define print conversion for size_t values */
+
81 #undef PRIsize_t
+
82 #if defined(WIN64) || defined(_WIN64)
+
83 #define PRIsize_t "I64u"
+
84 #else
+
85 #define PRIsize_t "I32u"
+
86 #endif
+
87
+
88 /* For MSVC 2012 and earlier define standard int types, otherwise use inttypes.h */
+
89 #if defined(_MSC_VER) && _MSC_VER <= 1700
+
90 typedef signed char int8_t;
+
91 typedef unsigned char uint8_t;
+
92 typedef signed short int int16_t;
+
93 typedef unsigned short int uint16_t;
+
94 typedef signed int int32_t;
+
95 typedef unsigned int uint32_t;
+
96 typedef signed __int64 int64_t;
+
97 typedef unsigned __int64 uint64_t;
+
98 #else
+
99 #include <inttypes.h>
+
100 #endif
+
101
+
102 /* For MSVC define PRId64 and SCNd64 and alternate functions */
+
103 #if defined(_MSC_VER)
+
104 #if !defined(PRId64)
+
105 #define PRId64 "I64d"
+
106 #endif
+
107 #if !defined(SCNd64)
+
108 #define SCNd64 "I64d"
+
109 #endif
+
110
+
111 #define snprintf _snprintf
+
112 #define vsnprintf _vsnprintf
+
113 #define strcasecmp _stricmp
+
114 #define strncasecmp _strnicmp
+
115 #define strtoull _strtoui64
+
116 #define fileno _fileno
+
117 #define fdopen _fdopen
+
118 #endif
+
119
+
120 /* Extras needed for MinGW */
+
121 #if defined(__MINGW32__) || defined(__MINGW64__)
+
122 #include <fcntl.h>
+
123
+
124 #define _fseeki64 fseeko64
+
125 #define _ftelli64 ftello64
+
126
+
127 #define fstat _fstat
+
128 #define stat _stat
+
129 #endif
+
130#else
+
131 /* All other platforms */
+
132 #include <inttypes.h>
+
133#endif
+
134
+
135#define MINRECLEN 40
+
136#define MAXRECLEN 10485760
+
137#define MAXRECLENv2 131172
+
138
+
139#define LM_SIDLEN 64
+
140
+
143#define MS_ISRATETOLERABLE(A,B) (ms_dabs (1.0 - ((A) / (B))) < 0.0001)
+
144
+
147#define MS2_ISDATAINDICATOR(X) ((X)=='D' || (X)=='R' || (X)=='Q' || (X)=='M')
+
148
+
+
165#define MS3_ISVALIDHEADER(X) ( \
+
166 *(X) == 'M' && *((X) + 1) == 'S' && *((X) + 2) == 3 && \
+
167 (uint8_t) (*((X) + 12)) >= 0 && (uint8_t) (*((X) + 12)) <= 23 && \
+
168 (uint8_t) (*((X) + 13)) >= 0 && (uint8_t) (*((X) + 13)) <= 59 && \
+
169 (uint8_t) (*((X) + 14)) >= 0 && (uint8_t) (*((X) + 14)) <= 60)
+
+
170
+
+
187#define MS2_ISVALIDHEADER(X) ( \
+
188 (isdigit ((uint8_t) * (X)) || *(X) == ' ' || !*(X)) && \
+
189 (isdigit ((uint8_t) * ((X) + 1)) || *((X) + 1) == ' ' || !*((X) + 1)) && \
+
190 (isdigit ((uint8_t) * ((X) + 2)) || *((X) + 2) == ' ' || !*((X) + 2)) && \
+
191 (isdigit ((uint8_t) * ((X) + 3)) || *((X) + 3) == ' ' || !*((X) + 3)) && \
+
192 (isdigit ((uint8_t) * ((X) + 4)) || *((X) + 4) == ' ' || !*((X) + 4)) && \
+
193 (isdigit ((uint8_t) * ((X) + 5)) || *((X) + 5) == ' ' || !*((X) + 5)) && \
+
194 MS2_ISDATAINDICATOR (*((X) + 6)) && \
+
195 (*((X) + 7) == ' ' || *((X) + 7) == '\0') && \
+
196 (uint8_t) (*((X) + 24)) >= 0 && (uint8_t) (*((X) + 24)) <= 23 && \
+
197 (uint8_t) (*((X) + 25)) >= 0 && (uint8_t) (*((X) + 25)) <= 59 && \
+
198 (uint8_t) (*((X) + 26)) >= 0 && (uint8_t) (*((X) + 26)) <= 60)
+
+
199
+
201#define bit(x,y) ((x)&(y)) ? 1 : 0
+
202
+
204#ifdef _MSC_VER
+
205#define DEPRECATED __declspec(deprecated)
+
206#elif defined(__GNUC__) | defined(__clang__)
+
207#define DEPRECATED __attribute__((__deprecated__))
+
208#else
+
209#define DEPRECATED
+
210#endif
+
211
+
224typedef int64_t nstime_t;
+
225
+
229#define NSTMODULUS 1000000000
+
230
+
234#define NSTERROR -2145916800000000000LL
+
235
+
239#define NSTUNSET -2145916799999999999LL
+
240
+
243#define MS_EPOCH2NSTIME(X) (X) * (nstime_t) NSTMODULUS
+
244
+
247#define MS_NSTIME2EPOCH(X) (X) / NSTMODULUS
+
248
+
256#define MS_HPTIME2NSTIME(X) (X) * (nstime_t) 1000
+
257
+
265#define MS_NSTIME2HPTIME(X) (X) / 1000
+
266
+
+
281typedef enum
+
282{
+
283 ISOMONTHDAY = 0,
+
284 ISOMONTHDAY_Z = 1,
+
285 ISOMONTHDAY_DOY = 2,
+
286 ISOMONTHDAY_DOY_Z = 3,
+
287 ISOMONTHDAY_SPACE = 4,
+
288 ISOMONTHDAY_SPACE_Z = 5,
+
289 SEEDORDINAL = 6,
+
290 UNIXEPOCH = 7,
+
291 NANOSECONDEPOCH = 8
+ +
+
293
+
+
306typedef enum
+
307{
+
308 NONE = 0,
+
309 MICRO = 1,
+
310 NANO = 2,
+
311 MICRO_NONE = 3,
+
312 NANO_NONE = 4,
+
313 NANO_MICRO = 5,
+
314 NANO_MICRO_NONE = 6
+ +
+
316
+
317extern int ms_nstime2time (nstime_t nstime, uint16_t *year, uint16_t *yday,
+
318 uint8_t *hour, uint8_t *min, uint8_t *sec, uint32_t *nsec);
+
319extern char* ms_nstime2timestr (nstime_t nstime, char *timestr,
+
320 ms_timeformat_t timeformat, ms_subseconds_t subsecond);
+
321DEPRECATED extern char* ms_nstime2timestrz (nstime_t nstime, char *timestr,
+
322 ms_timeformat_t timeformat, ms_subseconds_t subsecond);
+
323extern nstime_t ms_time2nstime (int year, int yday, int hour, int min, int sec, uint32_t nsec);
+
324extern nstime_t ms_timestr2nstime (const char *timestr);
+
325extern nstime_t ms_mdtimestr2nstime (const char *timestr);
+
326extern nstime_t ms_seedtimestr2nstime (const char *seedtimestr);
+
327extern int ms_doy2md (int year, int yday, int *month, int *mday);
+
328extern int ms_md2doy (int year, int month, int mday, int *yday);
+
329
+
345#define MS_PACK_DEFAULT_RECLEN 4096
+
346
+
350#define MS_PACK_DEFAULT_ENCODING DE_STEIM2
+
351
+
+
357typedef struct MS3Record {
+
358 const char *record;
+
359 int32_t reclen;
+
360 uint8_t swapflag;
+
361
+
362 /* Common header fields in accessible form */
+ + +
365 uint8_t flags;
+ +
367 double samprate;
+
368 int16_t encoding;
+
369 uint8_t pubversion;
+
370 int64_t samplecnt;
+
371 uint32_t crc;
+
372 uint16_t extralength;
+
373 uint32_t datalength;
+
374 char *extra;
+
375
+
376 /* Data sample fields */
+ +
378 uint64_t datasize;
+
379 int64_t numsamples;
+ +
381} MS3Record;
+
+
382
+
383extern int msr3_parse (const char *record, uint64_t recbuflen, MS3Record **ppmsr,
+
384 uint32_t flags, int8_t verbose);
+
385
+
386extern int msr3_pack (const MS3Record *msr,
+
387 void (*record_handler) (char *, int, void *),
+
388 void *handlerdata, int64_t *packedsamples,
+
389 uint32_t flags, int8_t verbose);
+
390
+
391extern int msr3_repack_mseed3 (const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose);
+
392
+
393extern int msr3_pack_header3 (const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose);
+
394
+
395extern int msr3_pack_header2 (const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose);
+
396
+
397extern int64_t msr3_unpack_data (MS3Record *msr, int8_t verbose);
+
398
+
399extern int msr3_data_bounds (const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize);
+
400
+
401extern int64_t ms_decode_data (const void *input, uint64_t inputsize, uint8_t encoding,
+
402 uint64_t samplecount, void *output, uint64_t outputsize,
+
403 char *sampletype, int8_t swapflag, const char *sid, int8_t verbose);
+
404
+
405extern MS3Record* msr3_init (MS3Record *msr);
+
406extern void msr3_free (MS3Record **ppmsr);
+
407extern MS3Record* msr3_duplicate (const MS3Record *msr, int8_t datadup);
+
408extern nstime_t msr3_endtime (const MS3Record *msr);
+
409extern void msr3_print (const MS3Record *msr, int8_t details);
+
410extern int msr3_resize_buffer (MS3Record *msr);
+
411extern double msr3_sampratehz (const MS3Record *msr);
+
412extern double msr3_host_latency (const MS3Record *msr);
+
413
+
414extern int64_t ms3_detect (const char *record, uint64_t recbuflen, uint8_t *formatversion);
+
415extern int ms_parse_raw3 (const char *record, int maxreclen, int8_t details);
+
416extern int ms_parse_raw2 (const char *record, int maxreclen, int8_t details, int8_t swapflag);
+ +
441
+
+
443typedef struct MS3Selections {
+
444 char sidpattern[100];
+ + +
447 uint8_t pubversion;
+ +
+
449
+
450extern const MS3Selections* ms3_matchselect (const MS3Selections *selections, const char *sid,
+
451 nstime_t starttime, nstime_t endtime,
+
452 int pubversion, const MS3SelectTime **ppselecttime);
+
453extern const MS3Selections* msr3_matchselect (const MS3Selections *selections, const MS3Record *msr,
+
454 const MS3SelectTime **ppselecttime);
+
455extern int ms3_addselect (MS3Selections **ppselections, const char *sidpattern,
+
456 nstime_t starttime, nstime_t endtime, uint8_t pubversion);
+
457extern int ms3_addselect_comp (MS3Selections **ppselections,
+
458 char *network, char* station, char *location, char *channel,
+
459 nstime_t starttime, nstime_t endtime, uint8_t pubversion);
+
460extern int ms3_readselectionsfile (MS3Selections **ppselections, const char *filename);
+
461extern void ms3_freeselections (MS3Selections *selections);
+
462extern void ms3_printselections (const MS3Selections *selections);
+
+
490typedef struct MS3RecordPtr
+
491{
+
492 const char *bufferptr;
+
493 FILE *fileptr;
+
494 const char *filename;
+
495 int64_t fileoffset;
+ + +
498 uint32_t dataoffset;
+
499 void *prvtptr;
+ + +
+
502
+
+
504typedef struct MS3RecordList
+
505{
+
506 uint64_t recordcnt;
+ + + +
+
510
+
545#define MSTRACEID_SKIPLIST_HEIGHT 8
+
546
+
+
548typedef struct MS3TraceSeg {
+ + +
551 double samprate;
+
552 int64_t samplecnt;
+ +
554 uint64_t datasize;
+
555 int64_t numsamples;
+ +
557 void *prvtptr;
+ + + + +
+
562
+ +
576
+
+
578typedef struct MS3TraceList {
+
579 uint32_t numtraceids;
+ +
581 uint64_t prngstate;
+ +
+
583
+
+
609typedef struct MS3Tolerance
+
610{
+
611 double (*time) (const MS3Record *msr);
+
612 double (*samprate) (const MS3Record *msr);
+ +
+
614
+
+
617#define MS3Tolerance_INITIALIZER \
+
618 { \
+
619 .time = NULL, .samprate = NULL \
+
620 }
+
+
621
+
622extern MS3TraceList* mstl3_init (MS3TraceList *mstl);
+
623extern void mstl3_free (MS3TraceList **ppmstl, int8_t freeprvtptr);
+
624extern MS3TraceID* mstl3_findID (MS3TraceList *mstl, const char *sid, uint8_t pubversion, MS3TraceID **prev);
+
625
+
+
628#define mstl3_addmsr(mstl, msr, splitversion, autoheal, flags, tolerance) \
+
629 mstl3_addmsr_recordptr (mstl, msr, NULL, splitversion, autoheal, flags, tolerance)
+
+
630
+
631extern MS3TraceSeg* mstl3_addmsr_recordptr (MS3TraceList *mstl, const MS3Record *msr, MS3RecordPtr **pprecptr,
+
632 int8_t splitversion, int8_t autoheal, uint32_t flags,
+
633 const MS3Tolerance *tolerance);
+
634extern int64_t mstl3_readbuffer (MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength,
+
635 int8_t splitversion, uint32_t flags,
+
636 const MS3Tolerance *tolerance, int8_t verbose);
+
637extern int64_t mstl3_readbuffer_selection (MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength,
+
638 int8_t splitversion, uint32_t flags,
+
639 const MS3Tolerance *tolerance, const MS3Selections *selections,
+
640 int8_t verbose);
+
641extern int64_t mstl3_unpack_recordlist (MS3TraceID *id, MS3TraceSeg *seg, void *output,
+
642 uint64_t outputsize, int8_t verbose);
+
643extern int mstl3_convertsamples (MS3TraceSeg *seg, char type, int8_t truncate);
+
644extern int mstl3_resize_buffers (MS3TraceList *mstl);
+
645extern int64_t mstl3_pack (MS3TraceList *mstl, void (*record_handler) (char *, int, void *),
+
646 void *handlerdata, int reclen, int8_t encoding,
+
647 int64_t *packedsamples, uint32_t flags, int8_t verbose, char *extra);
+
648extern void mstl3_printtracelist (const MS3TraceList *mstl, ms_timeformat_t timeformat,
+
649 int8_t details, int8_t gaps, int8_t versions);
+
650extern void mstl3_printsynclist (const MS3TraceList *mstl, const char *dccid, ms_subseconds_t subseconds);
+
651extern void mstl3_printgaplist (const MS3TraceList *mstl, ms_timeformat_t timeformat,
+
652 double *mingap, double *maxgap);
+
+
689typedef struct LMIO
+
690{
+
691 enum
+
692 {
+ + + +
696 LMIO_FD = 3
+ +
698 void *handle;
+
699 void *handle2;
+ +
701} LMIO;
+
+
702
+
+
705#define LMIO_INITIALIZER \
+
706 { \
+
707 .type = LMIO_NULL, .handle = NULL, .handle2 = NULL, .still_running = 0 \
+
708 }
+
+
709
+
+
717typedef struct MS3FileParam
+
718{
+
719 char path[512];
+
720 int64_t startoffset;
+
721 int64_t endoffset;
+
722 int64_t streampos;
+
723 int64_t recordcount;
+
724
+ + + +
728 uint32_t flags;
+ + +
+
731
+
+
734#define MS3FileParam_INITIALIZER \
+
735 { \
+
736 .path = "", .startoffset = 0, .endoffset = 0, .streampos = 0, \
+
737 .recordcount = 0, .readbuffer = NULL, .readlength = 0, \
+
738 .readoffset = 0, .flags = 0, .input = LMIO_INITIALIZER \
+
739 }
+
+
740
+
741extern int ms3_readmsr (MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose);
+
742extern int ms3_readmsr_r (MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath,
+
743 uint32_t flags, int8_t verbose);
+
744extern int ms3_readmsr_selection (MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath,
+
745 uint32_t flags, const MS3Selections *selections, int8_t verbose);
+
746extern int ms3_readtracelist (MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance,
+
747 int8_t splitversion, uint32_t flags, int8_t verbose);
+
748extern int ms3_readtracelist_timewin (MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance,
+
749 nstime_t starttime, nstime_t endtime, int8_t splitversion, uint32_t flags,
+
750 int8_t verbose);
+
751extern int ms3_readtracelist_selection (MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance,
+
752 const MS3Selections *selections, int8_t splitversion, uint32_t flags, int8_t verbose);
+
753extern int ms3_url_useragent (const char *program, const char *version);
+
754extern int ms3_url_userpassword (const char *userpassword);
+
755extern int ms3_url_addheader (const char *header);
+
756extern void ms3_url_freeheaders (void);
+
757extern int64_t msr3_writemseed (MS3Record *msr, const char *mspath, int8_t overwrite,
+
758 uint32_t flags, int8_t verbose);
+
759extern int64_t mstl3_writemseed (MS3TraceList *mst, const char *mspath, int8_t overwrite,
+
760 int maxreclen, int8_t encoding, uint32_t flags, int8_t verbose);
+
761extern int libmseed_url_support (void);
+
762extern MS3FileParam *ms3_mstl_init_fd (int fd);
+
774extern int ms_sid2nslc (const char *sid, char *net, char *sta, char *loc, char *chan);
+
775extern int ms_nslc2sid (char *sid, int sidlen, uint16_t flags,
+
776 const char *net, const char *sta, const char *loc, const char *chan);
+
777extern int ms_seedchan2xchan (char *xchan, const char *seedchan);
+
778extern int ms_xchan2seedchan (char *seedchan, const char *xchan);
+
779extern int ms_strncpclean (char *dest, const char *source, int length);
+
780extern int ms_strncpcleantail (char *dest, const char *source, int length);
+
781extern int ms_strncpopen (char *dest, const char *source, int length);
+
+
821typedef struct MSEHEventDetection
+
822{
+
823 char type[30];
+
824 char detector[30];
+ + + +
828 char wave[30];
+
829 char units[30];
+ +
831 uint8_t medsnr[6];
+ + + + +
+
836
+
+
845typedef struct MSEHCalibration
+
846{
+
847 char type[30];
+ + +
850 int steps;
+ + +
853 char trigger[30];
+ +
855 double amplitude;
+
856 char inputunits[30];
+
857 char amplituderange[30];
+
858 double duration;
+
859 double sineperiod;
+
860 double stepbetween;
+
861 char inputchannel[30];
+ +
863 char coupling[30];
+
864 char rolloff[30];
+
865 char noise[30];
+ + +
+
868
+
+ +
878{
+ + +
881 int usec;
+ +
883 uint32_t count;
+
884 char type[16];
+
885 char clockstatus[128];
+ +
+
887
+
+
896typedef struct MSEHRecenter
+
897{
+
898 char type[30];
+ + +
901 char trigger[30];
+ +
+
903
+
904
+
910typedef struct LM_PARSED_JSON_s LM_PARSED_JSON;
+
911
+
+
914#define mseh_get(msr, ptr, valueptr, type, maxlength) \
+
915 mseh_get_ptr_r (msr, ptr, valueptr, type, maxlength, NULL)
+
+
916
+
+
919#define mseh_get_number(msr, ptr, valueptr) \
+
920 mseh_get_ptr_r (msr, ptr, valueptr, 'n', 0, NULL)
+
+
921
+
+
924#define mseh_get_int64(msr, ptr, valueptr) \
+
925 mseh_get_ptr_r (msr, ptr, valueptr, 'i', 0, NULL)
+
+
926
+
+
929#define mseh_get_string(msr, ptr, buffer, maxlength) \
+
930 mseh_get_ptr_r (msr, ptr, buffer, 's', maxlength, NULL)
+
+
931
+
+
934#define mseh_get_boolean(msr, ptr, valueptr) \
+
935 mseh_get_ptr_r (msr, ptr, valueptr, 'b', 0, NULL)
+
+
936
+
+
939#define mseh_exists(msr, ptr) \
+
940 (!mseh_get_ptr_r (msr, ptr, NULL, 0, 0, NULL))
+
+
941
+
942extern int mseh_get_ptr_r (const MS3Record *msr, const char *ptr,
+
943 void *value, char type, uint32_t maxlength,
+
944 LM_PARSED_JSON **parsestate);
+
945
+
+
948#define mseh_set(msr, ptr, valueptr, type) \
+
949 mseh_set_ptr_r (msr, ptr, valueptr, type, NULL)
+
+
950
+
+
953#define mseh_set_number(msr, ptr, valueptr) \
+
954 mseh_set_ptr_r (msr, ptr, valueptr, 'n', NULL)
+
+
955
+
+
958#define mseh_set_int64(msr, ptr, valueptr) \
+
959 mseh_set_ptr_r (msr, ptr, valueptr, 'i', NULL)
+
+
960
+
+
963#define mseh_set_string(msr, ptr, valueptr) \
+
964 mseh_set_ptr_r (msr, ptr, valueptr, 's', NULL)
+
+
965
+
+
968#define mseh_set_boolean(msr, ptr, valueptr) \
+
969 mseh_set_ptr_r (msr, ptr, valueptr, 'b', NULL)
+
+
970
+
971extern int mseh_set_ptr_r (MS3Record *msr, const char *ptr,
+
972 void *value, char type,
+
973 LM_PARSED_JSON **parsestate);
+
974
+
975extern int mseh_add_event_detection_r (MS3Record *msr, const char *ptr,
+
976 MSEHEventDetection *eventdetection,
+
977 LM_PARSED_JSON **parsestate);
+
978
+
979extern int mseh_add_calibration_r (MS3Record *msr, const char *ptr,
+
980 MSEHCalibration *calibration,
+
981 LM_PARSED_JSON **parsestate);
+
982
+
983extern int mseh_add_timing_exception_r (MS3Record *msr, const char *ptr,
+
984 MSEHTimingException *exception,
+
985 LM_PARSED_JSON **parsestate);
+
986
+
987extern int mseh_add_recenter_r (MS3Record *msr, const char *ptr,
+
988 MSEHRecenter *recenter,
+
989 LM_PARSED_JSON **parsestate);
+
990
+
991extern int mseh_serialize (MS3Record *msr, LM_PARSED_JSON **parsestate);
+
992extern void mseh_free_parsestate (LM_PARSED_JSON **parsestate);
+
993extern int mseh_replace (MS3Record *msr, char *jsonstring);
+
994
+
995extern int mseh_print (const MS3Record *msr, int indent);
+
1104#define MAX_LOG_MSG_LENGTH 200
+
1105
+
+
1109typedef struct MSLogEntry
+
1110{
+
1111 int level;
+
1112 char function[30];
+ +
1114 struct MSLogEntry *next;
+
1115} MSLogEntry;
+
+
1116
+
+
1120typedef struct MSLogRegistry
+
1121{
+
1122 int maxmessages;
+
1123 int messagecnt;
+
1124 MSLogEntry *messages;
+ +
+
1126
+
+
1129#define MSLogRegistry_INITIALIZER \
+
1130 { \
+
1131 .maxmessages = 0, .messagecnt = 0, .messages = NULL \
+
1132 }
+
+
1133
+
+
1139typedef struct MSLogParam
+
1140{
+
1141 void (*log_print)(const char*);
+
1142 const char *logprefix;
+
1143 void (*diag_print)(const char*);
+
1144 const char *errprefix;
+ +
1146} MSLogParam;
+
+
1147
+
+
1150#define MSLogParam_INITIALIZER \
+
1151 { \
+
1152 .log_print = NULL, .logprefix = NULL, \
+
1153 .diag_print = NULL, .errprefix = NULL, \
+
1154 .registry = MSLogRegistry_INITIALIZER \
+
1155 }
+
+
1156
+
+
1160#define ms_log(level, ...) \
+
1161 ms_rlog(__func__, level, __VA_ARGS__)
+
+
1162
+
+
1166#define ms_log_l(logp, level, ...) \
+
1167 ms_rlog_l(logp, __func__, level, __VA_ARGS__)
+
+
1168
+
1169#if defined(__GNUC__) || defined(__clang__)
+
1170__attribute__((__format__ (__printf__, 3, 4)))
+
1171#endif
+
1172extern int ms_rlog (const char *function, int level, const char *format, ...);
+
1173#if defined(__GNUC__) || defined(__clang__)
+
1174__attribute__ ((__format__ (__printf__, 4, 5)))
+
1175#endif
+
1176extern int ms_rlog_l (MSLogParam *logp, const char *function, int level, const char *format, ...);
+
1177
+
+
1180#define ms_loginit(log_print, logprefix, diag_print, errprefix) \
+
1181 ms_rloginit(log_print, logprefix, diag_print, errprefix, 0)
+
+
1182
+
+
1185#define ms_loginit_l(logp, log_print, logprefix, diag_print, errprefix) \
+
1186 ms_rloginit_l(logp, log_print, logprefix, diag_print, errprefix, 0)
+
+
1187
+
1188extern void ms_rloginit (void (*log_print)(const char*), const char *logprefix,
+
1189 void (*diag_print)(const char*), const char *errprefix,
+
1190 int maxmessages);
+
1191extern MSLogParam *ms_rloginit_l (MSLogParam *logp,
+
1192 void (*log_print)(const char*), const char *logprefix,
+
1193 void (*diag_print)(const char*), const char *errprefix,
+
1194 int maxmessages);
+
1195extern int ms_rlog_emit (MSLogParam *logp, int count, int context);
+
1196extern int ms_rlog_free (MSLogParam *logp);
+
1197
+
+
1232typedef struct LeapSecond
+
1233{
+ +
1235 int32_t TAIdelta;
+ +
1237} LeapSecond;
+
+
1238
+ +
1241extern int ms_readleapseconds (const char *envvarname);
+
1242extern int ms_readleapsecondfile (const char *filename);
+
1249extern uint8_t ms_samplesize (char sampletype);
+
1250extern int ms_encoding_sizetype (uint8_t encoding, uint8_t *samplesize, char *sampletype);
+
1251extern const char *ms_encodingstr (uint8_t encoding);
+
1252extern const char *ms_errorstr (int errorcode);
+
1253
+
1254extern nstime_t ms_sampletime (nstime_t time, int64_t offset, double samprate);
+
1255extern double ms_dabs (double val);
+
1256extern int ms_bigendianhost (void);
+
1257
+
1259extern int64_t lmp_ftell64 (FILE *stream);
+
1261extern int lmp_fseek64 (FILE *stream, int64_t offset, int whence);
+
1263extern uint64_t lmp_nanosleep (uint64_t nanoseconds);
+
1264
+
1266extern uint32_t ms_crc32c (const uint8_t *input, int length, uint32_t previousCRC32C);
+
1267
+
1269static inline void
+
1270ms_gswap2 (void *data2)
+
1271{
+
1272 uint16_t dat;
+
1273
+
1274 memcpy (&dat, data2, 2);
+
1275
+
1276 dat = ((dat & 0xff00) >> 8) | ((dat & 0x00ff) << 8);
+
1277
+
1278 memcpy (data2, &dat, 2);
+
1279}
+
1280
+
1282static inline void
+
1283ms_gswap4 (void *data4)
+
1284{
+
1285 uint32_t dat;
+
1286
+
1287 memcpy (&dat, data4, 4);
+
1288
+
1289 dat = ((dat & 0xff000000) >> 24) | ((dat & 0x000000ff) << 24) |
+
1290 ((dat & 0x00ff0000) >> 8) | ((dat & 0x0000ff00) << 8);
+
1291
+
1292 memcpy (data4, &dat, 4);
+
1293}
+
1294
+
1296static inline void
+
1297ms_gswap8 (void *data8)
+
1298{
+
1299 uint64_t dat;
+
1300
+
1301 memcpy (&dat, data8, sizeof(uint64_t));
+
1302
+
1303 dat = ((dat & 0xff00000000000000) >> 56) | ((dat & 0x00000000000000ff) << 56) |
+
1304 ((dat & 0x00ff000000000000) >> 40) | ((dat & 0x000000000000ff00) << 40) |
+
1305 ((dat & 0x0000ff0000000000) >> 24) | ((dat & 0x0000000000ff0000) << 24) |
+
1306 ((dat & 0x000000ff00000000) >> 8) | ((dat & 0x00000000ff000000) << 8);
+
1307
+
1308 memcpy (data8, &dat, sizeof(uint64_t));
+
1309}
+
1310
+
1311#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) || defined (__clang__)
+
1313__attribute__ ((deprecated("Use ms_gswap2 instead.")))
+
1314static inline void ms_gswap2a (void *data2) { ms_gswap2 (data2); }
+
1316__attribute__ ((deprecated("Use ms_gswap4 instead.")))
+
1317static inline void ms_gswap4a (void *data4) { ms_gswap4 (data4); }
+
1319__attribute__ ((deprecated("Use ms_gswap8 instead.")))
+
1320static inline void ms_gswap8a (void *data8) { ms_gswap8 (data8); }
+
1321#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320)
+
1323__declspec(deprecated("Use ms_gswap2 instead."))
+
1324static inline void ms_gswap2a (void *data2) { ms_gswap2 (data2); }
+
1326__declspec(deprecated("Use ms_gswap4 instead."))
+
1327static inline void ms_gswap4a (void *data4) { ms_gswap4 (data4); }
+
1329__declspec(deprecated("Use ms_gswap8 instead."))
+
1330static inline void ms_gswap8a (void *data8) { ms_gswap8 (data8); }
+
1331#else
+
1333static inline void ms_gswap2a (void *data2) { ms_gswap2 (data2); }
+
1335static inline void ms_gswap4a (void *data4) { ms_gswap4 (data4); }
+
1337static inline void ms_gswap8a (void *data8) { ms_gswap8 (data8); }
+
1338#endif
+
1339
+
1343typedef int8_t flag;
+
1344
+
+
1369typedef struct LIBMSEED_MEMORY
+
1370{
+
1371 void *(*malloc) (size_t);
+
1372 void *(*realloc) (void *, size_t);
+
1373 void (*free) (void *);
+ +
+
1375
+ +
1378
+
1392extern size_t libmseed_prealloc_block_size;
+
1393
+
1398extern void *libmseed_memory_prealloc (void *ptr, size_t size, size_t *currentsize);
+
1399
+
1402#define DE_ASCII DE_TEXT
+
1403
+
1412#define DE_TEXT 0
+
1413#define DE_INT16 1
+
1414#define DE_INT32 3
+
1415#define DE_FLOAT32 4
+
1416#define DE_FLOAT64 5
+
1417#define DE_STEIM1 10
+
1418#define DE_STEIM2 11
+
1419#define DE_GEOSCOPE24 12
+
1420#define DE_GEOSCOPE163 13
+
1421#define DE_GEOSCOPE164 14
+
1422#define DE_CDSN 16
+
1423#define DE_SRO 30
+
1424#define DE_DWWSSN 32
+
1433#define MSSWAP_HEADER 0x01
+
1434#define MSSWAP_PAYLOAD 0x02
+
1442#define MS_ENDOFFILE 1
+
1443#define MS_NOERROR 0
+
1444#define MS_GENERROR -1
+
1445#define MS_NOTSEED -2
+
1446#define MS_WRONGLENGTH -3
+
1447#define MS_OUTOFRANGE -4
+
1448#define MS_UNKNOWNFORMAT -5
+
1449#define MS_STBADCOMPFLAG -6
+
1450#define MS_INVALIDCRC -7
+
1460#define MSF_UNPACKDATA 0x0001
+
1461#define MSF_SKIPNOTDATA 0x0002
+
1462#define MSF_VALIDATECRC 0x0004
+
1463#define MSF_PNAMERANGE 0x0008
+
1464#define MSF_ATENDOFFILE 0x0010
+
1465#define MSF_SEQUENCE 0x0020
+
1466#define MSF_FLUSHDATA 0x0040
+
1467#define MSF_PACKVER2 0x0080
+
1468#define MSF_RECORDLIST 0x0100
+
1469#define MSF_MAINTAINMSTL 0x0200
+
1472#ifdef __cplusplus
+
1473}
+
1474#endif
+
1475
+
1476#endif /* LIBMSEED_H */
+
struct MS3SelectTime * next
Pointer to next selection time, NULL if the last.
Definition libmseed.h:439
+
nstime_t endtime
Latest data for matching channels, use NSTUNSET for open.
Definition libmseed.h:438
+
uint8_t pubversion
Selected publication version, use 0 for any.
Definition libmseed.h:447
+
char sidpattern[100]
Matching (globbing) pattern for source ID.
Definition libmseed.h:444
+
struct MS3Selections * next
Pointer to next selection, NULL if the last.
Definition libmseed.h:446
+
nstime_t starttime
Earliest data for matching channels, use NSTUNSET for open.
Definition libmseed.h:437
+
struct MS3SelectTime * timewindows
Pointer to time window list for this source ID.
Definition libmseed.h:445
+
int ms3_addselect(MS3Selections **ppselections, const char *sidpattern, nstime_t starttime, nstime_t endtime, uint8_t pubversion)
Add selection parameters to selection list.
Definition selection.c:181
+
int ms3_readselectionsfile(MS3Selections **ppselections, const char *filename)
Read data selections from a file.
Definition selection.c:428
+
void ms3_printselections(const MS3Selections *selections)
Print the selections list using the ms_log() facility.
Definition selection.c:707
+
void ms3_freeselections(MS3Selections *selections)
Free all memory associated with a MS3Selections.
Definition selection.c:665
+
const MS3Selections * ms3_matchselect(const MS3Selections *selections, const char *sid, nstime_t starttime, nstime_t endtime, int pubversion, const MS3SelectTime **ppselecttime)
Test the specified parameters for a matching selection entry.
Definition selection.c:58
+
int ms3_addselect_comp(MS3Selections **ppselections, char *network, char *station, char *location, char *channel, nstime_t starttime, nstime_t endtime, uint8_t pubversion)
Add selection parameters to a selection list based on separate source name codes.
Definition selection.c:305
+
const MS3Selections * msr3_matchselect(const MS3Selections *selections, const MS3Record *msr, const MS3SelectTime **ppselecttime)
Test the MS3Record for a matching selection entry.
Definition selection.c:145
+
Data selection structure time window definition containers.
Definition libmseed.h:436
+
Data selection structure definition containers.
Definition libmseed.h:443
+
char type[30]
Definition libmseed.h:823
+
double duration
Definition libmseed.h:858
+
char wave[30]
Definition libmseed.h:828
+
char inputchannel[30]
Definition libmseed.h:861
+
struct MSEHEventDetection * next
Definition libmseed.h:834
+
double signalperiod
Definition libmseed.h:826
+
char amplituderange[30]
Definition libmseed.h:857
+
int firstpulsepositive
Definition libmseed.h:851
+
nstime_t onsettime
Definition libmseed.h:830
+
int medlookback
Definition libmseed.h:832
+
float vcocorrection
Definition libmseed.h:880
+
nstime_t endtime
Definition libmseed.h:849
+
char type[30]
Definition libmseed.h:847
+
struct MSEHCalibration * next
Definition libmseed.h:866
+
int continued
Definition libmseed.h:854
+
char clockstatus[128]
Definition libmseed.h:885
+
double signalamplitude
Definition libmseed.h:825
+
double stepbetween
Definition libmseed.h:860
+
uint32_t count
Definition libmseed.h:883
+
char units[30]
Definition libmseed.h:829
+
int alternatesign
Definition libmseed.h:852
+
char type[30]
Definition libmseed.h:898
+
double backgroundestimate
Definition libmseed.h:827
+
nstime_t time
Definition libmseed.h:879
+
double amplitude
Definition libmseed.h:855
+
char rolloff[30]
Definition libmseed.h:864
+
char trigger[30]
Definition libmseed.h:853
+
char coupling[30]
Definition libmseed.h:863
+
int steps
Definition libmseed.h:850
+
char noise[30]
Definition libmseed.h:865
+
char trigger[30]
Definition libmseed.h:901
+
char inputunits[30]
Definition libmseed.h:856
+
double sineperiod
Definition libmseed.h:859
+
int usec
Definition libmseed.h:881
+
uint8_t medsnr[6]
Definition libmseed.h:831
+
int medpickalgorithm
Definition libmseed.h:833
+
char type[16]
Definition libmseed.h:884
+
nstime_t begintime
Definition libmseed.h:899
+
double refamplitude
Definition libmseed.h:862
+
char detector[30]
Definition libmseed.h:824
+
nstime_t endtime
Definition libmseed.h:900
+
nstime_t begintime
Definition libmseed.h:848
+
int receptionquality
Definition libmseed.h:882
+
int mseh_add_timing_exception_r(MS3Record *msr, const char *ptr, MSEHTimingException *exception, LM_PARSED_JSON **parsestate)
Add timing exception to the extra headers of the given record.
Definition extraheaders.c:821
+
int mseh_print(const MS3Record *msr, int indent)
Print the extra header structure for the specified MS3Record.
Definition extraheaders.c:1156
+
int mseh_serialize(MS3Record *msr, LM_PARSED_JSON **parsestate)
Generate extra headers string (serialize) from internal state.
Definition extraheaders.c:997
+
int mseh_add_event_detection_r(MS3Record *msr, const char *ptr, MSEHEventDetection *eventdetection, LM_PARSED_JSON **parsestate)
Add event detection to the extra headers of the given record.
Definition extraheaders.c:493
+
int mseh_get_ptr_r(const MS3Record *msr, const char *ptr, void *value, char type, uint32_t maxlength, LM_PARSED_JSON **parsestate)
Search for and return an extra header value.
Definition extraheaders.c:150
+
int mseh_add_calibration_r(MS3Record *msr, const char *ptr, MSEHCalibration *calibration, LM_PARSED_JSON **parsestate)
Add calibration to the extra headers of the given record.
Definition extraheaders.c:629
+
void mseh_free_parsestate(LM_PARSED_JSON **parsestate)
Free internally parsed (deserialized) JSON data.
Definition extraheaders.c:1054
+
int mseh_set_ptr_r(MS3Record *msr, const char *ptr, void *value, char type, LM_PARSED_JSON **parsestate)
Set the value of extra header values.
Definition extraheaders.c:312
+
struct LM_PARSED_JSON_s LM_PARSED_JSON
Internal structure for holding parsed JSON extra headers.
Definition libmseed.h:910
+
int mseh_add_recenter_r(MS3Record *msr, const char *ptr, MSEHRecenter *recenter, LM_PARSED_JSON **parsestate)
Add recenter event to the extra headers of the given record.
Definition extraheaders.c:913
+
int mseh_replace(MS3Record *msr, char *jsonstring)
Replace extra headers with supplied JSON.
Definition extraheaders.c:1091
+
Container for calibration parameters for use in extra headers.
Definition libmseed.h:846
+
Container for event detection parameters for use in extra headers.
Definition libmseed.h:822
+
Container for recenter parameters for use in extra headers.
Definition libmseed.h:897
+
Container for timing exception parameters for use in extra headers.
Definition libmseed.h:878
+
int readlength
INTERNAL: Length of data in read buffer.
Definition libmseed.h:726
+
int64_t streampos
OUTPUT: Read position of input stream.
Definition libmseed.h:722
+
int64_t endoffset
INPUT: End position in input stream, 0 == unknown (e.g. pipe)
Definition libmseed.h:721
+
int64_t recordcount
OUTPUT: Count of records read from this stream/file so far.
Definition libmseed.h:723
+
LMIO input
INTERNAL: IO handle, file or URL.
Definition libmseed.h:729
+
uint32_t flags
INTERNAL: Stream reading state flags.
Definition libmseed.h:728
+
char path[512]
INPUT: File name or URL.
Definition libmseed.h:719
+
int readoffset
INTERNAL: Read offset in read buffer.
Definition libmseed.h:727
+
char * readbuffer
INTERNAL: Read buffer, allocated internally.
Definition libmseed.h:725
+
int64_t startoffset
INPUT: Start position in input stream.
Definition libmseed.h:720
+
int ms3_readtracelist(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags, int8_t verbose)
Read miniSEED from a file into a trace list.
Definition fileutils.c:587
+
int ms3_readtracelist_selection(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t splitversion, uint32_t flags, int8_t verbose)
Read miniSEED from a file into a trace list, with selection filtering.
Definition fileutils.c:676
+
void ms3_url_freeheaders(void)
Free all set headers for URL-based requests.
Definition fileutils.c:847
+
int ms3_readmsr_r(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose)
Read miniSEED records from a file or URL in a thread-safe way.
Definition fileutils.c:144
+
int ms3_url_addheader(const char *header)
Add header to any URL-based requests.
Definition fileutils.c:827
+
int libmseed_url_support(void)
Run-time test for URL support in libmseed.
Definition fileutils.c:49
+
int ms3_readmsr(MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose)
Read miniSEED records from a file or URL.
Definition fileutils.c:117
+
int ms3_readtracelist_timewin(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, nstime_t starttime, nstime_t endtime, int8_t splitversion, uint32_t flags, int8_t verbose)
Read miniSEED from a file into a trace list, with time range selection.
Definition fileutils.c:612
+
int64_t mstl3_writemseed(MS3TraceList *mst, const char *mspath, int8_t overwrite, int maxreclen, int8_t encoding, uint32_t flags, int8_t verbose)
Write miniSEED from an MS3TraceList container to a file.
Definition fileutils.c:960
+
int ms3_readmsr_selection(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, const MS3Selections *selections, int8_t verbose)
Read miniSEED records from a file or URL with optional selection.
Definition fileutils.c:257
+
int ms3_url_userpassword(const char *userpassword)
Set authentication credentials for URL-based requests.
Definition fileutils.c:798
+
MS3FileParam * ms3_mstl_init_fd(int fd)
Initialize MS3FileParam parameters for a file descriptor.
Definition fileutils.c:75
+
int64_t msr3_writemseed(MS3Record *msr, const char *mspath, int8_t overwrite, uint32_t flags, int8_t verbose)
Write miniSEED from an MS3Record container to a file.
Definition fileutils.c:899
+
int ms3_url_useragent(const char *program, const char *version)
Set User-Agent header for URL-based requests.
Definition fileutils.c:768
+
State container for reading miniSEED records from files or URLs.
Definition libmseed.h:718
+
int32_t TAIdelta
TAI-UTC difference in seconds.
Definition libmseed.h:1235
+
nstime_t leapsecond
Time of leap second as epoch since 1 January 1900.
Definition libmseed.h:1234
+
struct LeapSecond * next
Pointer to next entry, NULL if the last.
Definition libmseed.h:1236
+
LeapSecond * leapsecondlist
+
int ms_readleapsecondfile(const char *filename)
Read leap second from the specified file.
Definition genutils.c:1749
+
int ms_readleapseconds(const char *envvarname)
Read leap second file specified by an environment variable.
Definition genutils.c:1719
+
Leap second list container.
Definition libmseed.h:1233
+
char message[MAX_LOG_MSG_LENGTH]
Log, warning or error message.
Definition libmseed.h:1113
+
char function[30]
Function generating the message.
Definition libmseed.h:1112
+
int level
Message level.
Definition libmseed.h:1111
+
int ms_rlog_l(MSLogParam *logp, const char *function, int level, const char *format,...)
Register log message using specified logging parameters.
Definition logging.c:310
+
MSLogParam * ms_rloginit_l(MSLogParam *logp, void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages)
Initialize specified MSLogParam logging parameters.
Definition logging.c:134
+
#define MAX_LOG_MSG_LENGTH
Definition libmseed.h:1104
+
int ms_rlog_free(MSLogParam *logp)
Free, without emitting, all messages from log registry.
Definition logging.c:637
+
void ms_rloginit(void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages)
Initialize the global logging parameters.
Definition logging.c:92
+
int ms_rlog(const char *function, int level, const char *format,...)
Register log message using global logging parameters.
Definition logging.c:258
+
int ms_rlog_emit(MSLogParam *logp, int count, int context)
Emit, aka send to print functions, messages from log registry.
Definition logging.c:573
+
Log registry entry.
Definition libmseed.h:1110
+
Log message registry.
Definition libmseed.h:1121
+
LIBMSEED_MEMORY libmseed_memory
+
void * libmseed_memory_prealloc(void *ptr, size_t size, size_t *currentsize)
+
size_t libmseed_prealloc_block_size
+
uint8_t swapflag
Byte swap indicator (bitmask), see Byte swap flags.
Definition libmseed.h:360
+
void * datasamples
Data samples, numsamples of type sampletype.
Definition libmseed.h:377
+
uint32_t datalength
Length of data payload in bytes.
Definition libmseed.h:373
+
uint32_t crc
CRC of entire record.
Definition libmseed.h:371
+
uint8_t formatversion
Format major version.
Definition libmseed.h:364
+
int32_t reclen
Length of miniSEED record in bytes.
Definition libmseed.h:359
+
uint8_t flags
Record-level bit flags.
Definition libmseed.h:365
+
uint16_t extralength
Length of extra headers in bytes.
Definition libmseed.h:372
+
uint64_t datasize
Size of datasamples buffer in bytes.
Definition libmseed.h:378
+
const char * record
Raw miniSEED record, if available.
Definition libmseed.h:358
+
double samprate
Nominal sample rate as samples/second (Hz) or period (s)
Definition libmseed.h:367
+
int64_t numsamples
Number of data samples in datasamples.
Definition libmseed.h:379
+
int64_t samplecnt
Number of samples in record.
Definition libmseed.h:370
+
char sampletype
Sample type code: t, i, f, d Sample Types.
Definition libmseed.h:380
+
int16_t encoding
Data encoding format, see Data Encodings.
Definition libmseed.h:368
+
nstime_t starttime
Record start time (first sample)
Definition libmseed.h:366
+
char sid[LM_SIDLEN]
Source identifier as URN, max length LM_SIDLEN.
Definition libmseed.h:363
+
uint8_t pubversion
Publication version.
Definition libmseed.h:369
+
char * extra
Pointer to extra headers.
Definition libmseed.h:374
+
int64_t ms3_detect(const char *record, uint64_t recbuflen, uint8_t *formatversion)
Detect miniSEED record in buffer.
Definition parseutils.c:179
+
int msr3_repack_mseed3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose)
Repack a parsed miniSEED record into a version 3 record.
Definition pack.c:394
+
void msr3_print(const MS3Record *msr, int8_t details)
Print header values of an MS3Record.
Definition msrutils.c:228
+
MS3Record * msr3_init(MS3Record *msr)
Initialize and return an MS3Record.
Definition msrutils.c:44
+
double msr3_sampratehz(const MS3Record *msr)
Calculate sample rate in samples/second (Hertz) for a given MS3Record.
Definition msrutils.c:347
+
int64_t msr3_unpack_data(MS3Record *msr, int8_t verbose)
Unpack data samples for a MS3Record.
Definition unpack.c:1121
+
double msr3_host_latency(const MS3Record *msr)
Calculate data latency based on the host time.
Definition msrutils.c:374
+
int msr3_pack_header2(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose)
Pack a miniSEED version 2 header into the specified buffer.
Definition pack.c:858
+
void msr3_free(MS3Record **ppmsr)
Free all memory associated with a MS3Record.
Definition msrutils.c:89
+
int ms_parse_raw3(const char *record, int maxreclen, int8_t details)
Parse and verify a miniSEED 3.x record header.
Definition parseutils.c:316
+
int msr3_resize_buffer(MS3Record *msr)
Resize data sample buffer of MS3Record to what is needed.
Definition msrutils.c:305
+
int64_t ms_decode_data(const void *input, uint64_t inputsize, uint8_t encoding, uint64_t samplecount, void *output, uint64_t outputsize, char *sampletype, int8_t swapflag, const char *sid, int8_t verbose)
Decode data samples to a supplied buffer.
Definition unpack.c:1276
+
int msr3_parse(const char *record, uint64_t recbuflen, MS3Record **ppmsr, uint32_t flags, int8_t verbose)
Parse miniSEED from a buffer.
Definition parseutils.c:61
+
MS3Record * msr3_duplicate(const MS3Record *msr, int8_t datadup)
Duplicate a MS3Record.
Definition msrutils.c:121
+
nstime_t msr3_endtime(const MS3Record *msr)
Calculate time of the last sample in a record.
Definition msrutils.c:202
+
int ms_parse_raw2(const char *record, int maxreclen, int8_t details, int8_t swapflag)
Parse and verify a miniSEED 2.x record header.
Definition parseutils.c:527
+
int msr3_pack_header3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose)
Pack a miniSEED version 3 header into the specified buffer.
Definition pack.c:489
+
int msr3_data_bounds(const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize)
Determine the data payload bounds for a MS3Record.
Definition unpack.c:1022
+
int msr3_pack(const MS3Record *msr, void(*record_handler)(char *, int, void *), void *handlerdata, int64_t *packedsamples, uint32_t flags, int8_t verbose)
Pack data into miniSEED records.
Definition pack.c:106
+
miniSEED record container
Definition libmseed.h:357
+
struct MS3RecordPtr * next
Pointer to next entry, NULL if the last.
Definition libmseed.h:500
+
void * prvtptr
Private pointer, will not be populated by library but will be free'd.
Definition libmseed.h:499
+
MS3RecordPtr * last
Pointer to last entry, NULL if the none.
Definition libmseed.h:508
+
int64_t fileoffset
Offset into file to record for fileptr or filename.
Definition libmseed.h:495
+
const char * filename
Pointer to file name containing record, NULL if not used.
Definition libmseed.h:494
+
MS3RecordPtr * first
Pointer to first entry, NULL if the none.
Definition libmseed.h:507
+
MS3Record * msr
Pointer to MS3Record for this record.
Definition libmseed.h:496
+
const char * bufferptr
Pointer in buffer to record, NULL if not used.
Definition libmseed.h:492
+
FILE * fileptr
Pointer to open FILE containing record, NULL if not used.
Definition libmseed.h:493
+
uint64_t recordcnt
Count of records in the list (for convenience)
Definition libmseed.h:506
+
nstime_t endtime
End time of record, time of last sample.
Definition libmseed.h:497
+
uint32_t dataoffset
Offset from start of record to encoded data.
Definition libmseed.h:498
+
Record list, holds MS3RecordPtr entries that contribute to a given MS3TraceSeg.
Definition libmseed.h:505
+
A miniSEED record pointer and metadata.
Definition libmseed.h:491
+
int ms_strncpopen(char *dest, const char *source, int length)
Copy fixed number of characters into unterminated string.
Definition genutils.c:690
+
int ms_sid2nslc(const char *sid, char *net, char *sta, char *loc, char *chan)
Parse network, station, location and channel from an FDSN Source ID.
Definition genutils.c:183
+
int ms_strncpclean(char *dest, const char *source, int length)
Copy string, removing spaces, always terminated.
Definition genutils.c:584
+
int ms_xchan2seedchan(char *seedchan, const char *xchan)
Convert extended channel to SEED 2.x channel.
Definition genutils.c:480
+
int ms_seedchan2xchan(char *xchan, const char *seedchan)
Convert SEED 2.x channel to extended channel.
Definition genutils.c:435
+
int ms_strncpcleantail(char *dest, const char *source, int length)
Copy string, removing trailing spaces, always terminated.
Definition genutils.c:638
+
int ms_nslc2sid(char *sid, int sidlen, uint16_t flags, const char *net, const char *sta, const char *loc, const char *chan)
Convert network, station, location and channel to an FDSN Source ID.
Definition genutils.c:314
+ + + + + + + + + + + + +
struct MS3TraceID * next[MSTRACEID_SKIPLIST_HEIGHT]
Next trace ID at first pointer, NULL if the last.
Definition libmseed.h:573
+
int64_t numsamples
Number of data samples in datasamples.
Definition libmseed.h:555
+
struct MS3RecordList * recordlist
List of pointers to records that contributed.
Definition libmseed.h:558
+
uint64_t prngstate
INTERNAL: State for Pseudo RNG.
Definition libmseed.h:581
+
nstime_t endtime
Time of last sample.
Definition libmseed.h:550
+
struct MS3TraceSeg * first
Pointer to first of list of segments.
Definition libmseed.h:571
+
nstime_t latest
Time of latest sample.
Definition libmseed.h:568
+
struct MS3TraceID traces
Head node of trace skip list, first entry at traces.next[0].
Definition libmseed.h:580
+
uint8_t pubversion
Largest contributing publication version.
Definition libmseed.h:566
+
void * prvtptr
Private pointer for general use, unused by library.
Definition libmseed.h:557
+
uint8_t height
Height of skip list at next.
Definition libmseed.h:574
+
uint64_t datasize
Size of datasamples buffer in bytes.
Definition libmseed.h:554
+
nstime_t earliest
Time of earliest sample.
Definition libmseed.h:567
+
void * prvtptr
Private pointer for general use, unused by library.
Definition libmseed.h:569
+
void * datasamples
Data samples, numsamples of type sampletype.
Definition libmseed.h:553
+
char sampletype
Sample type code, see Sample Types.
Definition libmseed.h:556
+
struct MS3TraceSeg * prev
Pointer to previous segment.
Definition libmseed.h:559
+
int64_t samplecnt
Number of samples in trace coverage.
Definition libmseed.h:552
+
char sid[LM_SIDLEN]
Source identifier as URN, max length LM_SIDLEN.
Definition libmseed.h:565
+
struct MS3TraceSeg * last
Pointer to last of list of segments.
Definition libmseed.h:572
+
uint32_t numtraceids
Number of traces IDs in list.
Definition libmseed.h:579
+
double samprate
Nominal sample rate (Hz)
Definition libmseed.h:551
+
struct MS3TraceSeg * next
Pointer to next segment, NULL if the last.
Definition libmseed.h:560
+
nstime_t starttime
Time of first sample.
Definition libmseed.h:549
+
uint32_t numsegments
Number of segments for this ID.
Definition libmseed.h:570
+
int64_t mstl3_unpack_recordlist(MS3TraceID *id, MS3TraceSeg *seg, void *output, uint64_t outputsize, int8_t verbose)
Unpack data samples in a Record List associated with a MS3TraceList.
Definition tracelist.c:1651
+
void mstl3_printsynclist(const MS3TraceList *mstl, const char *dccid, ms_subseconds_t subseconds)
Print SYNC trace list summary information for a MS3TraceList.
Definition tracelist.c:2289
+
void mstl3_printtracelist(const MS3TraceList *mstl, ms_timeformat_t timeformat, int8_t details, int8_t gaps, int8_t versions)
Print trace list summary information for a MS3TraceList.
Definition tracelist.c:2157
+
int64_t mstl3_pack(MS3TraceList *mstl, void(*record_handler)(char *, int, void *), void *handlerdata, int reclen, int8_t encoding, int64_t *packedsamples, uint32_t flags, int8_t verbose, char *extra)
Pack MS3TraceList data into miniSEED records.
Definition tracelist.c:1973
+
void mstl3_free(MS3TraceList **ppmstl, int8_t freeprvtptr)
Free all memory associated with a MS3TraceList.
Definition tracelist.c:86
+
int64_t mstl3_readbuffer(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, int8_t verbose)
Parse miniSEED from a buffer and populate a MS3TraceList.
Definition tracelist.c:853
+
void mstl3_printgaplist(const MS3TraceList *mstl, ms_timeformat_t timeformat, double *mingap, double *maxgap)
Print gap/overlap list summary information for a MS3TraceList.
Definition tracelist.c:2362
+
int mstl3_resize_buffers(MS3TraceList *mstl)
Resize data sample buffers of MS3TraceList to what is needed.
Definition tracelist.c:1560
+
int64_t mstl3_readbuffer_selection(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t verbose)
Parse miniSEED from a buffer and populate a MS3TraceList.
Definition tracelist.c:902
+
int mstl3_convertsamples(MS3TraceSeg *seg, char type, int8_t truncate)
Convert the data samples associated with an MS3TraceSeg to another data type.
Definition tracelist.c:1410
+
MS3TraceList * mstl3_init(MS3TraceList *mstl)
Initialize a MS3TraceList container.
Definition tracelist.c:51
+
#define MSTRACEID_SKIPLIST_HEIGHT
Maximum skip list height for MSTraceIDs.
Definition libmseed.h:545
+
MS3TraceID * mstl3_findID(MS3TraceList *mstl, const char *sid, uint8_t pubversion, MS3TraceID **prev)
Find matching MS3TraceID in a MS3TraceList.
Definition tracelist.c:177
+
MS3TraceSeg * mstl3_addmsr_recordptr(MS3TraceList *mstl, const MS3Record *msr, MS3RecordPtr **pprecptr, int8_t splitversion, int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance)
Add data coverage from an MS3Record to a MS3TraceList.
Definition tracelist.c:361
+
Container for a trace ID, linkable.
Definition libmseed.h:564
+
Container for a collection of continuous trace segment, linkable.
Definition libmseed.h:578
+
Container for a continuous trace segment, linkable.
Definition libmseed.h:548
+
uint32_t ms_crc32c(const uint8_t *input, int length, uint32_t previousCRC32C)
+
int ms_encoding_sizetype(uint8_t encoding, uint8_t *samplesize, char *sampletype)
Return sample size and/or type for given encoding value.
Definition lookup.c:74
+
uint8_t ms_samplesize(char sampletype)
Determine data sample size for each type.
Definition lookup.c:39
+
int ms_bigendianhost(void)
Runtime test for host endianess.
Definition genutils.c:1698
+
uint64_t lmp_nanosleep(uint64_t nanoseconds)
+
nstime_t ms_sampletime(nstime_t time, int64_t offset, double samprate)
Calculate the time of a sample in an array.
Definition genutils.c:1638
+
int lmp_fseek64(FILE *stream, int64_t offset, int whence)
+
int64_t lmp_ftell64(FILE *stream)
+
const char * ms_encodingstr(uint8_t encoding)
Descriptive string for data encodings.
Definition lookup.c:126
+
const char * ms_errorstr(int errorcode)
Descriptive string for library Return codes.
Definition lookup.c:205
+
double ms_dabs(double val)
Determine the absolute value of an input double.
Definition genutils.c:1685
+
int8_t flag
Definition libmseed.h:1343
+
#define LM_SIDLEN
Length of source ID string.
Definition libmseed.h:139
+
#define DEPRECATED
Definition libmseed.h:209
+
Definition libmseed.h:1370
+
void(* free)(void *)
Pointer to desired free()
Definition libmseed.h:1373
+
Type definition for data source I/O: file-system versus URL.
Definition libmseed.h:690
+
void * handle
Primary IO handle, either file or URL.
Definition libmseed.h:698
+
void * handle2
Secondary IO handle for URL.
Definition libmseed.h:699
+
int still_running
Fetch status flag for URL transmissions.
Definition libmseed.h:700
+
@ LMIO_FD
IO handle is a provided file descriptor.
Definition libmseed.h:696
+
@ LMIO_URL
IO handle is URL-type.
Definition libmseed.h:695
+
@ LMIO_NULL
IO handle type is undefined.
Definition libmseed.h:693
+
@ LMIO_FILE
IO handle is FILE-type.
Definition libmseed.h:694
+
enum LMIO::@0 type
IO handle type.
+
Callback functions that return time and sample rate tolerances.
Definition libmseed.h:610
+
double(* samprate)(const MS3Record *msr)
Pointer to function that returns sample rate tolerance.
Definition libmseed.h:612
+
double(* time)(const MS3Record *msr)
Pointer to function that returns time tolerance.
Definition libmseed.h:611
+
Logging parameters. Callers should not modify these values directly and generally should not need to ...
Definition libmseed.h:1140
+
void(* diag_print)(const char *)
Function to call for diagnostic and error messages.
Definition libmseed.h:1143
+
void(* log_print)(const char *)
Function to call for regular messages.
Definition libmseed.h:1141
+
const char * logprefix
Message prefix for regular and diagnostic messages.
Definition libmseed.h:1142
+
const char * errprefix
Message prefix for error messages.
Definition libmseed.h:1144
+
MSLogRegistry registry
Message registry.
Definition libmseed.h:1145
+
+ + + + + diff --git a/menu.js b/menu.js new file mode 100644 index 0000000..717761d --- /dev/null +++ b/menu.js @@ -0,0 +1,134 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +function initMenu(relPath,searchEnabled,serverSide,searchPage,search) { + function makeTree(data,relPath) { + let result=''; + if ('children' in data) { + result+='
    '; + for (let i in data.children) { + let url; + const link = data.children[i].url; + if (link.substring(0,1)=='^') { + url = link.substring(1); + } else { + url = relPath+link; + } + result+='
  • '+ + data.children[i].text+''+ + makeTree(data.children[i],relPath)+'
  • '; + } + result+='
'; + } + return result; + } + let searchBoxHtml; + if (searchEnabled) { + if (serverSide) { + searchBoxHtml='
'+ + '
'+ + '
 '+ + ''+ + '
'+ + '
'+ + '
'+ + '
'; + } else { + searchBoxHtml='
'+ + ''+ + ' '+ + ''+ + ''+ + ''+ + ''+ + ''+ + '
'; + } + } + + $('#main-nav').before('
'+ + ''+ + ''+ + '
'); + $('#main-nav').append(makeTree(menudata,relPath)); + $('#main-nav').children(':first').addClass('sm sm-dox').attr('id','main-menu'); + if (searchBoxHtml) { + $('#main-menu').append('
  • '); + } + const $mainMenuState = $('#main-menu-state'); + let prevWidth = 0; + if ($mainMenuState.length) { + const initResizableIfExists = function() { + if (typeof initResizable==='function') initResizable(); + } + // animate mobile menu + $mainMenuState.change(function() { + const $menu = $('#main-menu'); + let options = { duration: 250, step: initResizableIfExists }; + if (this.checked) { + options['complete'] = () => $menu.css('display', 'block'); + $menu.hide().slideDown(options); + } else { + options['complete'] = () => $menu.css('display', 'none'); + $menu.show().slideUp(options); + } + }); + // set default menu visibility + const resetState = function() { + const $menu = $('#main-menu'); + const newWidth = $(window).outerWidth(); + if (newWidth!=prevWidth) { + if ($(window).outerWidth()<768) { + $mainMenuState.prop('checked',false); $menu.hide(); + $('#searchBoxPos1').html(searchBoxHtml); + $('#searchBoxPos2').hide(); + } else { + $menu.show(); + $('#searchBoxPos1').empty(); + $('#searchBoxPos2').html(searchBoxHtml); + $('#searchBoxPos2').show(); + } + if (typeof searchBox!=='undefined') { + searchBox.CloseResultsWindow(); + } + prevWidth = newWidth; + } + } + $(window).ready(function() { resetState(); initResizableIfExists(); }); + $(window).resize(resetState); + } + $('#main-menu').smartmenus(); +} +/* @license-end */ diff --git a/menudata.js b/menudata.js new file mode 100644 index 0000000..064d19c --- /dev/null +++ b/menudata.js @@ -0,0 +1,95 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file +*/ +var menudata={children:[ +{text:"Home",url:"index.html"}, +{text:"Data Structures",url:"annotated.html",children:[ +{text:"Data Structures",url:"annotated.html"}, +{text:"Data Structure Index",url:"classes.html"}, +{text:"Data Fields",url:"functions.html",children:[ +{text:"All",url:"functions.html",children:[ +{text:"a",url:"functions.html#index_a"}, +{text:"b",url:"functions.html#index_b"}, +{text:"c",url:"functions.html#index_c"}, +{text:"d",url:"functions.html#index_d"}, +{text:"e",url:"functions.html#index_e"}, +{text:"f",url:"functions.html#index_f"}, +{text:"h",url:"functions.html#index_h"}, +{text:"i",url:"functions.html#index_i"}, +{text:"l",url:"functions.html#index_l"}, +{text:"m",url:"functions.html#index_m"}, +{text:"n",url:"functions.html#index_n"}, +{text:"o",url:"functions.html#index_o"}, +{text:"p",url:"functions.html#index_p"}, +{text:"r",url:"functions.html#index_r"}, +{text:"s",url:"functions.html#index_s"}, +{text:"t",url:"functions.html#index_t"}, +{text:"u",url:"functions.html#index_u"}, +{text:"v",url:"functions.html#index_v"}, +{text:"w",url:"functions.html#index_w"}]}, +{text:"Variables",url:"functions_vars.html",children:[ +{text:"a",url:"functions_vars.html#index_a"}, +{text:"b",url:"functions_vars.html#index_b"}, +{text:"c",url:"functions_vars.html#index_c"}, +{text:"d",url:"functions_vars.html#index_d"}, +{text:"e",url:"functions_vars.html#index_e"}, +{text:"f",url:"functions_vars.html#index_f"}, +{text:"h",url:"functions_vars.html#index_h"}, +{text:"i",url:"functions_vars.html#index_i"}, +{text:"l",url:"functions_vars.html#index_l"}, +{text:"m",url:"functions_vars.html#index_m"}, +{text:"n",url:"functions_vars.html#index_n"}, +{text:"o",url:"functions_vars.html#index_o"}, +{text:"p",url:"functions_vars.html#index_p"}, +{text:"r",url:"functions_vars.html#index_r"}, +{text:"s",url:"functions_vars.html#index_s"}, +{text:"t",url:"functions_vars.html#index_t"}, +{text:"u",url:"functions_vars.html#index_u"}, +{text:"v",url:"functions_vars.html#index_v"}, +{text:"w",url:"functions_vars.html#index_w"}]}, +{text:"Enumerator",url:"functions_eval.html"}]}]}, +{text:"Functions, etc.",url:"globals.html",children:[ +{text:"All",url:"globals.html",children:[ +{text:"b",url:"globals.html#index_b"}, +{text:"d",url:"globals.html#index_d"}, +{text:"f",url:"globals.html#index_f"}, +{text:"l",url:"globals.html#index_l"}, +{text:"m",url:"globals.html#index_m"}, +{text:"n",url:"globals.html#index_n"}, +{text:"p",url:"globals.html#index_p"}]}, +{text:"Functions",url:"globals_func.html",children:[ +{text:"l",url:"globals_func.html#index_l"}, +{text:"m",url:"globals_func.html#index_m"}]}, +{text:"Variables",url:"globals_vars.html"}, +{text:"Typedefs",url:"globals_type.html"}, +{text:"Enumerations",url:"globals_enum.html"}, +{text:"Macros",url:"globals_defs.html",children:[ +{text:"b",url:"globals_defs.html#index_b"}, +{text:"d",url:"globals_defs.html#index_d"}, +{text:"l",url:"globals_defs.html#index_l"}, +{text:"m",url:"globals_defs.html#index_m"}, +{text:"n",url:"globals_defs.html#index_n"}, +{text:"p",url:"globals_defs.html#index_p"}]}]}, +{text:"Examples",url:"page-examples.html"}, +{text:"FAQ",url:"page-faq.html"}]} diff --git a/minus.svg b/minus.svg new file mode 100644 index 0000000..f70d0c1 --- /dev/null +++ b/minus.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/minusd.svg b/minusd.svg new file mode 100644 index 0000000..5f8e879 --- /dev/null +++ b/minusd.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/nav_f.png b/nav_f.png new file mode 100644 index 0000000000000000000000000000000000000000..37e7bd01cfd36a49eb606b393d1abc829f254170 GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^j6iI`!2~2XGqLUlQdyoZjv*C{Z|{0@wHOGnT=09f zBZ*%@Ctt*kjcADv#q^tRRJF|^-W_?f0 zJGG=ra_jd=b6&SF)<`KC&Aj`z_hsk*^7r@I_38w*>zCfR0UOP8M2oco_4)@xAnZJm+FK+wtg|2pVuD|W@+G)+F=ON=IQF^vd$@?2>{kp9#8-P literal 0 HcmV?d00001 diff --git a/nav_hd.png b/nav_hd.png new file mode 100644 index 0000000000000000000000000000000000000000..462581961fa0c0a35d1b2fd075e5e7a07482c6f1 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^j6lr8!2~3AUOE6t23=1V$B+ufw|8%IGAJ-O1R8pD{S_iX1&Ip+dR2DmVP`HuXz1$P&s=g!`zn~;aihm6@YYly85}Sb4q9e027rT Ang9R* literal 0 HcmV?d00001 diff --git a/open.png b/open.png new file mode 100644 index 0000000000000000000000000000000000000000..f4064b42e4b1da2de2f9a80e62fe70afdadc6d58 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^oFL4>1|%O$WD@{V4xTQKAr*{o=WgU=P~c(FpLzZm zJ8)zm!LBLa&H7NWb^(I&yuX@0Tj(^MCmx UPkg+l4m69w)78&qol`;+0FziJX#fBK literal 0 HcmV?d00001 diff --git a/page-capabilities.html b/page-capabilities.html new file mode 100644 index 0000000..9a7aa10 --- /dev/null +++ b/page-capabilities.html @@ -0,0 +1,127 @@ + + + + + + + +libmseed: Capabilities + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    Capabilities
    +
    +
    + +

    +Overview

    +

    This section describes the capabilities and fundamentals of the library.

    +

    +Data Records

    +
    Note
    miniSEED data are constructed as records, typically anywhere from 128 to 4096 bytes in length. Each record is independent, identifying the data source, encoding type, etc. in header structures. Reconstructing a continuous time series from an arbitrary number of data records is an excersize for a format reader, e.g. this library.
    +

    A miniSEED record is represented in the library using the MS3Record structure. This structure is used for both unpacking and packing of miniSEED records. When unpacking with msr3_parse() this structure is populated. When packing with msr3_pack() this structure is used as a template for the resulting data records and as a source of samples to be packed.

    +

    +Sample Encodings

    +

    The library supports all commonly used Data Encodings for decoding and a subset of the most common values for encoding. The following data encoding formats are supported for both unpacking and packing: ASCII, INT16, INT32, FLOAT32, FLOAT64, STEIM1 and STEIM2. The INT and FLOAT encodings each have two versions for quantities with a different number of bits of representation. The STEIM compression encodings work with 32-bit integers. The following data encoding formats are supported for unpacking only: GEOSCOPE (24-bit, 16/3 and 16/4 gain ranged), CDSN, SRO and DWWSSN.

    +

    +Traces

    +

    In order to reconstruct, manage and process continuous trace segments the library provides Trace List functionality.

    +

    Trace List structures are nested to contain an arbitrary number of identified time series, each containing an arbitrary number continuous time series segments, aka traces. While a trace list is normally used to hold trace information and associated data samples they can also be used without data samples as a means of tracking data coverage without actual sample values.

    +

    +Time representation

    +

    Internally, time stamps are represented as nanoseconds since the Unix/POSIX epoch via the nstime_t data type. A number of functions exist to parse or generate date-time strings to or from this representation. See Time definitions and functions.

    +

    Note:* nanosecond time resolution does not mean the data included this resolution.

    +

    +Time series data formats

    +

    Time series data samples are supported in a few different formats depending on how they are unpacked or will be packed. Samples can be either ASCII, 32-bit integer, 32-bit floats or 64-bit double precision floats. These types are represented internally using the single-character Sample Types.

    +

    +Log messages

    +

    All of the log and diagnostic messages emitted by the library functions use a central logging facility. It is common for programs that use the library to also use these logging functions. Furthermore, the output from these logging interfaces can be controlled by directing output to callback functions. This is useful when the library will be embedded in a larger system with it's own logging facility. See the Central Logging page for more details.

    +
    +
    + + + + + diff --git a/page-examples.html b/page-examples.html new file mode 100644 index 0000000..162acab --- /dev/null +++ b/page-examples.html @@ -0,0 +1,1664 @@ + + + + + + + +libmseed: Examples + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    Examples
    +
    +
    + +

    +Overview

    +

    The most basic usage of the library is illustrated in the Tutorial. This page contains full example programs that utilize the library for common tasks. These examples are included in the source distribution and (most) are used in the test suite.

    +

    While these are full working programs the aspects not related to library usage, e.g. argument parsing, are often minimized and left uncommented as they will change in real world usage.

    +

    +Read miniSEED from files

    +

    A simple program to read miniSEED from files and print details from each record:

    +
    /***************************************************************************
    +
    * A simple example of using libmseed to read miniSEED.
    +
    *
    +
    * Opens a user specified file, parses the miniSEED records and prints
    +
    * details for each record.
    +
    *
    +
    * This file is part of the miniSEED Library.
    +
    *
    +
    * Copyright (c) 2023 Chad Trabant, EarthScope Data Services
    +
    *
    +
    * Licensed under the Apache License, Version 2.0 (the "License");
    +
    * you may not use this file except in compliance with the License.
    +
    * You may obtain a copy of the License at
    +
    *
    +
    * http://www.apache.org/licenses/LICENSE-2.0
    +
    *
    +
    * Unless required by applicable law or agreed to in writing, software
    +
    * distributed under the License is distributed on an "AS IS" BASIS,
    +
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +
    * See the License for the specific language governing permissions and
    +
    * limitations under the License.
    +
    ***************************************************************************/
    +
    +
    #include <errno.h>
    +
    #include <stdio.h>
    +
    #include <stdlib.h>
    +
    #include <string.h>
    +
    #include <time.h>
    +
    +
    #include <libmseed.h>
    +
    +
    #define VERSION "[libmseed " LIBMSEED_VERSION " example]"
    +
    #define PACKAGE "mseedview"
    +
    +
    static int8_t verbose = 0;
    +
    static int8_t ppackets = 0;
    +
    static int8_t basicsum = 0;
    +
    static int printdata = 0;
    +
    static char *inputfile = NULL;
    +
    +
    static int parameter_proc (int argcount, char **argvec);
    +
    static void usage (void);
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    MS3Record *msr = NULL;
    +
    uint32_t flags = 0;
    +
    +
    int64_t totalrecs = 0;
    +
    int64_t totalsamps = 0;
    +
    int retcode;
    +
    +
    /* Process command line arguments */
    +
    if (parameter_proc (argc, argv) < 0)
    +
    return -1;
    +
    +
    /* Set flag to validate CRCs when reading */
    +
    flags |= MSF_VALIDATECRC;
    +
    +
    /* Parse byte range from file/URL path name if present */
    +
    flags |= MSF_PNAMERANGE;
    +
    +
    /* Set flag to unpack data if printing samples */
    +
    if (printdata)
    +
    flags |= MSF_UNPACKDATA;
    +
    +
    /* Enable accumulation of up to 10 error and warning messages */
    +
    ms_rloginit (NULL, NULL, NULL, NULL, 10);
    +
    +
    /* Loop over the input file record by record */
    +
    while ((retcode = ms3_readmsr (&msr, inputfile, flags, verbose)) == MS_NOERROR)
    +
    {
    +
    totalrecs++;
    +
    totalsamps += msr->samplecnt;
    +
    +
    msr3_print (msr, ppackets);
    +
    +
    /* Print data samples */
    +
    if (printdata && msr->numsamples > 0)
    +
    {
    +
    int line, col, cnt, samplesize;
    +
    int lines = (msr->numsamples / 6) + 1;
    +
    void *sptr;
    +
    +
    if ((samplesize = ms_samplesize (msr->sampletype)) == 0)
    +
    {
    +
    ms_log (2, "Unrecognized sample type: '%c'\n", msr->sampletype);
    +
    }
    +
    +
    for (cnt = 0, line = 0; line < lines; line++)
    +
    {
    +
    for (col = 0; col < 6; col++)
    +
    {
    +
    if (cnt < msr->numsamples)
    +
    {
    +
    sptr = (char *)msr->datasamples + (cnt * samplesize);
    +
    +
    if (msr->sampletype == 'i')
    +
    ms_log (0, "%10d ", *(int32_t *)sptr);
    +
    +
    else if (msr->sampletype == 'f')
    +
    ms_log (0, "%10.8g ", *(float *)sptr);
    +
    +
    else if (msr->sampletype == 'd')
    +
    ms_log (0, "%10.10g ", *(double *)sptr);
    +
    +
    cnt++;
    +
    }
    +
    }
    +
    ms_log (0, "\n");
    +
    +
    /* If only printing the first 6 samples break out here */
    +
    if (printdata == 1)
    +
    break;
    +
    }
    +
    }
    +
    }
    +
    +
    /* Emit all accumulated warning and error messages */
    +
    ms_rlog_emit (NULL, 0, verbose);
    +
    +
    /* Make sure everything is cleaned up */
    +
    ms3_readmsr (&msr, NULL, 0, 0);
    +
    +
    if (basicsum)
    +
    ms_log (0, "Records: %" PRId64 ", Samples: %" PRId64 "\n",
    +
    totalrecs, totalsamps);
    +
    +
    return 0;
    +
    } /* End of main() */
    +
    +
    /***************************************************************************
    +
    * parameter_proc():
    +
    * Process the command line arguments.
    +
    *
    +
    * Returns 0 on success, and -1 on failure
    +
    ***************************************************************************/
    +
    static int
    +
    parameter_proc (int argcount, char **argvec)
    +
    {
    +
    int optind;
    +
    +
    /* Process all command line arguments */
    +
    for (optind = 1; optind < argcount; optind++)
    +
    {
    +
    if (strcmp (argvec[optind], "-V") == 0)
    +
    {
    +
    ms_log (1, "%s version: %s\n", PACKAGE, VERSION);
    +
    exit (0);
    +
    }
    +
    else if (strcmp (argvec[optind], "-h") == 0)
    +
    {
    +
    usage ();
    +
    exit (0);
    +
    }
    +
    else if (strncmp (argvec[optind], "-v", 2) == 0)
    +
    {
    +
    verbose += strspn (&argvec[optind][1], "v");
    +
    }
    +
    else if (strncmp (argvec[optind], "-p", 2) == 0)
    +
    {
    +
    ppackets += strspn (&argvec[optind][1], "p");
    +
    }
    +
    else if (strncmp (argvec[optind], "-d", 2) == 0)
    +
    {
    +
    printdata = 1;
    +
    }
    +
    else if (strncmp (argvec[optind], "-D", 2) == 0)
    +
    {
    +
    printdata = 2;
    +
    }
    +
    else if (strcmp (argvec[optind], "-s") == 0)
    +
    {
    +
    basicsum = 1;
    +
    }
    +
    else if (strncmp (argvec[optind], "-", 1) == 0 &&
    +
    strlen (argvec[optind]) > 1)
    +
    {
    +
    ms_log (2, "Unknown option: %s\n", argvec[optind]);
    +
    exit (1);
    +
    }
    +
    else if (inputfile == NULL)
    +
    {
    +
    inputfile = argvec[optind];
    +
    }
    +
    else
    +
    {
    +
    ms_log (2, "Unknown option: %s\n", argvec[optind]);
    +
    exit (1);
    +
    }
    +
    }
    +
    +
    /* Make sure an input file was specified */
    +
    if (!inputfile)
    +
    {
    +
    ms_log (2, "No input file was specified\n\n");
    +
    ms_log (1, "%s version %s\n\n", PACKAGE, VERSION);
    +
    ms_log (1, "Try %s -h for usage\n", PACKAGE);
    +
    exit (1);
    +
    }
    +
    +
    /* Add program name and version to User-Agent for URL-based requests */
    +
    if (libmseed_url_support() && ms3_url_useragent(PACKAGE, VERSION))
    +
    return -1;
    +
    +
    /* Report the program version */
    +
    if (verbose)
    +
    ms_log (1, "%s version: %s\n", PACKAGE, VERSION);
    +
    +
    return 0;
    +
    } /* End of parameter_proc() */
    +
    +
    /***************************************************************************
    +
    * usage():
    +
    * Print the usage message and exit.
    +
    ***************************************************************************/
    +
    static void
    +
    usage (void)
    +
    {
    +
    fprintf (stderr, "%s version: %s\n\n", PACKAGE, VERSION);
    +
    fprintf (stderr, "Usage: %s [options] file\n\n", PACKAGE);
    +
    fprintf (stderr,
    +
    " ## Options ##\n"
    +
    " -V Report program version\n"
    +
    " -h Show this usage message\n"
    +
    " -v Be more verbose, multiple flags can be used\n"
    +
    " -p Print details of header, multiple flags can be used\n"
    +
    " -d Print first 6 sample values\n"
    +
    " -D Print all sample values\n"
    +
    " -s Print a basic summary after processing a file\n"
    +
    "\n"
    +
    " file File of miniSEED records\n"
    +
    "\n");
    +
    } /* End of usage() */
    +
    #define MSF_PNAMERANGE
    [Parsing] Parse and utilize byte range from path name suffix
    Definition libmseed.h:1463
    +
    #define MSF_UNPACKDATA
    [Parsing] Unpack data samples
    Definition libmseed.h:1460
    +
    #define MSF_VALIDATECRC
    [Parsing] Validate CRC (if version 3)
    Definition libmseed.h:1462
    +
    int libmseed_url_support(void)
    Run-time test for URL support in libmseed.
    Definition fileutils.c:49
    +
    int ms3_readmsr(MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose)
    Read miniSEED records from a file or URL.
    Definition fileutils.c:117
    +
    int ms3_url_useragent(const char *program, const char *version)
    Set User-Agent header for URL-based requests.
    Definition fileutils.c:768
    +
    #define ms_log(level,...)
    Wrapper for ms_rlog(), call as ms_log (level, format, ...)
    Definition libmseed.h:1160
    +
    void ms_rloginit(void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages)
    Initialize the global logging parameters.
    Definition logging.c:92
    +
    int ms_rlog_emit(MSLogParam *logp, int count, int context)
    Emit, aka send to print functions, messages from log registry.
    Definition logging.c:573
    +
    void * datasamples
    Data samples, numsamples of type sampletype.
    Definition libmseed.h:377
    +
    int64_t numsamples
    Number of data samples in datasamples.
    Definition libmseed.h:379
    +
    int64_t samplecnt
    Number of samples in record.
    Definition libmseed.h:370
    +
    char sampletype
    Sample type code: t, i, f, d Sample Types.
    Definition libmseed.h:380
    +
    void msr3_print(const MS3Record *msr, int8_t details)
    Print header values of an MS3Record.
    Definition msrutils.c:228
    +
    miniSEED record container
    Definition libmseed.h:357
    +
    #define MS_NOERROR
    No error.
    Definition libmseed.h:1443
    +
    uint8_t ms_samplesize(char sampletype)
    Determine data sample size for each type.
    Definition lookup.c:39
    + +

    +Reading with selections

    +

    Read miniSEED with Data Selections used to limit what is read. Additionally, this program reads data into a Trace List and illustrates traversing the entries.

    +
    /***************************************************************************
    +
    * A program for reading miniSEED using data selections to limit which
    +
    * data is read. This program also illustrates traversing a trace
    +
    * list.
    +
    *
    +
    * This file is part of the miniSEED Library.
    +
    *
    +
    * Copyright (c) 2023 Chad Trabant, EarthScope Data Services
    +
    *
    +
    * Licensed under the Apache License, Version 2.0 (the "License");
    +
    * you may not use this file except in compliance with the License.
    +
    * You may obtain a copy of the License at
    +
    *
    +
    * http://www.apache.org/licenses/LICENSE-2.0
    +
    *
    +
    * Unless required by applicable law or agreed to in writing, software
    +
    * distributed under the License is distributed on an "AS IS" BASIS,
    +
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +
    * See the License for the specific language governing permissions and
    +
    * limitations under the License.
    +
    ***************************************************************************/
    +
    +
    #include <stdio.h>
    +
    #include <sys/stat.h>
    +
    #include <errno.h>
    +
    +
    #include <libmseed.h>
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    MS3Selections *selections = NULL;
    +
    MS3TraceList *mstl = NULL;
    +
    MS3TraceID *tid = NULL;
    +
    MS3TraceSeg *seg = NULL;
    +
    +
    char *mseedfile = NULL;
    +
    char *selectionfile = NULL;
    +
    char starttimestr[30];
    +
    char endtimestr[30];
    +
    uint32_t flags = 0;
    +
    int8_t verbose = 0;
    +
    int rv;
    +
    +
    if (argc != 3)
    +
    {
    +
    ms_log (2, "Usage: %s <mseedfile> <selectionfile>\n",argv[0]);
    +
    return -1;
    +
    }
    +
    +
    mseedfile = argv[1];
    +
    selectionfile = argv[2];
    +
    +
    /* Read data selections from specified file */
    +
    if (ms3_readselectionsfile (&selections, selectionfile) < 0)
    +
    {
    +
    ms_log (2, "Cannot read data selection file\n");
    +
    return -1;
    +
    }
    +
    +
    /* Set bit flags to validate CRC and unpack data samples */
    +
    flags |= MSF_VALIDATECRC;
    +
    flags |= MSF_UNPACKDATA;
    +
    +
    /* Read all miniSEED into a trace list, limiting to selections */
    +
    rv = ms3_readtracelist_selection (&mstl, mseedfile, NULL,
    +
    selections, 0, flags, verbose);
    +
    +
    if (rv != MS_NOERROR)
    +
    {
    +
    ms_log (2, "Cannot read miniSEED from file: %s\n", ms_errorstr(rv));
    +
    return -1;
    +
    }
    +
    +
    /* Traverse trace list structures and print summary information */
    +
    tid = mstl->traces.next[0];
    +
    while (tid)
    +
    {
    +
    if (!ms_nstime2timestr (tid->earliest, starttimestr, SEEDORDINAL, NANO_MICRO_NONE) ||
    +
    !ms_nstime2timestr (tid->latest, endtimestr, SEEDORDINAL, NANO_MICRO_NONE))
    +
    {
    +
    ms_log (2, "Cannot create time strings\n");
    +
    starttimestr[0] = endtimestr[0] = '\0';
    +
    }
    +
    +
    ms_log (0, "TraceID for %s (%d), earliest: %s, latest: %s, segments: %u\n",
    +
    tid->sid, tid->pubversion, starttimestr, endtimestr, tid->numsegments);
    +
    +
    seg = tid->first;
    +
    while (seg)
    +
    {
    +
    if (!ms_nstime2timestr (seg->starttime, starttimestr, SEEDORDINAL, NANO_MICRO_NONE) ||
    +
    !ms_nstime2timestr (seg->endtime, endtimestr, SEEDORDINAL, NANO_MICRO_NONE))
    +
    {
    +
    ms_log (2, "Cannot create time strings\n");
    +
    starttimestr[0] = endtimestr[0] = '\0';
    +
    }
    +
    +
    ms_log (0, " Segment %s - %s, samples: %" PRId64 ", sample rate: %g, sample type: %c\n",
    +
    starttimestr, endtimestr, seg->numsamples, seg->samprate,
    +
    (seg->sampletype) ? seg->sampletype : ' ');
    +
    +
    seg = seg->next;
    +
    }
    +
    +
    tid = tid->next[0];
    +
    }
    +
    +
    /* Make sure everything is cleaned up */
    +
    if (mstl)
    +
    mstl3_free (&mstl, 0);
    +
    +
    if (selections)
    +
    ms3_freeselections (selections);
    +
    +
    return 0;
    +
    }
    +
    int ms3_readselectionsfile(MS3Selections **ppselections, const char *filename)
    Read data selections from a file.
    Definition selection.c:428
    +
    void ms3_freeselections(MS3Selections *selections)
    Free all memory associated with a MS3Selections.
    Definition selection.c:665
    +
    Data selection structure definition containers.
    Definition libmseed.h:443
    +
    int ms3_readtracelist_selection(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t splitversion, uint32_t flags, int8_t verbose)
    Read miniSEED from a file into a trace list, with selection filtering.
    Definition fileutils.c:676
    + +
    struct MS3TraceID * next[MSTRACEID_SKIPLIST_HEIGHT]
    Next trace ID at first pointer, NULL if the last.
    Definition libmseed.h:573
    +
    int64_t numsamples
    Number of data samples in datasamples.
    Definition libmseed.h:555
    +
    nstime_t endtime
    Time of last sample.
    Definition libmseed.h:550
    +
    struct MS3TraceSeg * first
    Pointer to first of list of segments.
    Definition libmseed.h:571
    +
    nstime_t latest
    Time of latest sample.
    Definition libmseed.h:568
    +
    struct MS3TraceID traces
    Head node of trace skip list, first entry at traces.next[0].
    Definition libmseed.h:580
    +
    uint8_t pubversion
    Largest contributing publication version.
    Definition libmseed.h:566
    +
    nstime_t earliest
    Time of earliest sample.
    Definition libmseed.h:567
    +
    char sampletype
    Sample type code, see Sample Types.
    Definition libmseed.h:556
    +
    char sid[LM_SIDLEN]
    Source identifier as URN, max length LM_SIDLEN.
    Definition libmseed.h:565
    +
    double samprate
    Nominal sample rate (Hz)
    Definition libmseed.h:551
    +
    struct MS3TraceSeg * next
    Pointer to next segment, NULL if the last.
    Definition libmseed.h:560
    +
    nstime_t starttime
    Time of first sample.
    Definition libmseed.h:549
    +
    uint32_t numsegments
    Number of segments for this ID.
    Definition libmseed.h:570
    +
    void mstl3_free(MS3TraceList **ppmstl, int8_t freeprvtptr)
    Free all memory associated with a MS3TraceList.
    Definition tracelist.c:86
    +
    Container for a trace ID, linkable.
    Definition libmseed.h:564
    +
    Container for a collection of continuous trace segment, linkable.
    Definition libmseed.h:578
    +
    Container for a continuous trace segment, linkable.
    Definition libmseed.h:548
    +
    const char * ms_errorstr(int errorcode)
    Descriptive string for library Return codes.
    Definition lookup.c:205
    +

    +Reading with record lists

    +

    Read miniSEED a file in 2 passes:

      +
    1. Read the file and construct a Trace List without unpacking the data samples and constructing a Record List
    2. +
    3. Unpack the data samples for each segment individually.
    4. +
    +

    This pattern allows the caller to selectively unpack the data by segment if desired.

    +

    While this example unpacks the data into a buffer allocated by the library, the unpacking routine mstl3_unpack_recordlist() also allows data samples to be placed directly into caller-specified memory buffers.

    +

    While this example uses ms3_readtracelist() for reading data from a file, the same functionality exists in mstl3_readbuffer() for reading data from a memory buffer.

    +
    /***************************************************************************
    +
    * A program for reading miniSEED into a trace list followed by
    +
    * unpacking from an associated record list.
    +
    *
    +
    * This file is part of the miniSEED Library.
    +
    *
    +
    * Copyright (c) 2023 Chad Trabant, EarthScope Data Services
    +
    *
    +
    * Licensed under the Apache License, Version 2.0 (the "License");
    +
    * you may not use this file except in compliance with the License.
    +
    * You may obtain a copy of the License at
    +
    *
    +
    * http://www.apache.org/licenses/LICENSE-2.0
    +
    *
    +
    * Unless required by applicable law or agreed to in writing, software
    +
    * distributed under the License is distributed on an "AS IS" BASIS,
    +
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +
    * See the License for the specific language governing permissions and
    +
    * limitations under the License.
    +
    ***************************************************************************/
    +
    +
    #include <stdio.h>
    +
    #include <sys/stat.h>
    +
    #include <limits.h>
    +
    #include <errno.h>
    +
    +
    #include <libmseed.h>
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    MS3TraceList *mstl = NULL;
    +
    MS3TraceID *tid = NULL;
    +
    MS3TraceSeg *seg = NULL;
    +
    MS3RecordPtr *recptr = NULL;
    +
    +
    char *mseedfile = NULL;
    +
    char starttimestr[30];
    +
    char endtimestr[30];
    +
    char bufferptrstr[30];
    +
    char fileptrstr[30];
    +
    uint32_t flags = 0;
    +
    int8_t verbose = 0;
    +
    uint64_t idx;
    +
    int rv;
    +
    +
    char printdata = 0;
    +
    int64_t unpacked;
    +
    uint8_t samplesize;
    +
    char sampletype;
    +
    uint64_t lineidx;
    +
    uint64_t lines;
    +
    int col;
    +
    void *sptr;
    +
    +
    if (argc < 2)
    +
    {
    +
    ms_log (2, "Usage: %s <mseedfile> [-v] [-d] [-D]\n",argv[0]);
    +
    return -1;
    +
    }
    +
    +
    mseedfile = argv[1];
    +
    +
    /* Simplistic argument parsing */
    +
    for (idx = 2; (int)idx < argc; idx++)
    +
    {
    +
    if (strncmp (argv[idx], "-v", 2) == 0)
    +
    verbose += strspn (&argv[idx][1], "v");
    +
    else if (strncmp (argv[idx], "-d", 2) == 0)
    +
    printdata = 'd';
    +
    else if (strncmp (argv[idx], "-D", 2) == 0)
    +
    printdata = 'D';
    +
    }
    +
    +
    /* Set bit flag to validate CRC */
    +
    flags |= MSF_VALIDATECRC;
    +
    +
    /* Set bit flag to build a record list */
    +
    flags |= MSF_RECORDLIST;
    +
    +
    /* Read all miniSEED into a trace list, limiting to selections */
    +
    rv = ms3_readtracelist (&mstl, mseedfile, NULL, 0, flags, verbose);
    +
    +
    if (rv != MS_NOERROR)
    +
    {
    +
    ms_log (2, "Cannot read miniSEED from file: %s\n", ms_errorstr(rv));
    +
    return -1;
    +
    }
    +
    +
    /* Traverse trace list structures and print summary information */
    +
    tid = mstl->traces.next[0];
    +
    while (tid)
    +
    {
    +
    ms_log (0, "TraceID for %s (%d), segments: %u\n",
    +
    tid->sid, tid->pubversion, tid->numsegments);
    +
    +
    seg = tid->first;
    +
    while (seg)
    +
    {
    +
    if (!ms_nstime2timestr (seg->starttime, starttimestr, ISOMONTHDAY, NANO) ||
    +
    !ms_nstime2timestr (seg->endtime, endtimestr, ISOMONTHDAY, NANO))
    +
    {
    +
    ms_log (2, "Cannot create time strings\n");
    +
    starttimestr[0] = endtimestr[0] = '\0';
    +
    }
    +
    +
    ms_log (0, " Segment %s - %s, samples: %" PRId64 ", sample rate: %g\n",
    +
    starttimestr, endtimestr, seg->samplecnt, seg->samprate);
    +
    +
    if (seg->recordlist)
    +
    {
    +
    ms_log (0, " Record list:\n");
    +
    +
    /* Traverse record list print summary information */
    +
    recptr = seg->recordlist->first;
    +
    while (recptr)
    +
    {
    +
    if (recptr->bufferptr == NULL)
    +
    strcpy (bufferptrstr, "NULL");
    +
    else
    +
    snprintf (bufferptrstr, sizeof(bufferptrstr), "%" PRIu64, (uint64_t)recptr->bufferptr);
    +
    +
    if (recptr->fileptr == NULL)
    +
    strcpy (fileptrstr, "NULL");
    +
    else
    +
    snprintf (fileptrstr, sizeof(fileptrstr), "%" PRIu64, (uint64_t)recptr->fileptr);
    +
    +
    ms_log (0, " RECORD: bufferptr: %s, fileptr: %s, filename: %s, fileoffset: %"PRId64"\n",
    +
    bufferptrstr, fileptrstr, recptr->filename, recptr->fileoffset);
    +
    ms_nstime2timestr (recptr->msr->starttime, starttimestr, ISOMONTHDAY_Z, NANO);
    +
    ms_nstime2timestr (recptr->endtime, endtimestr, ISOMONTHDAY_Z, NANO);
    +
    ms_log (0, " Start: %s, End: %s\n", starttimestr, endtimestr);
    +
    +
    recptr = recptr->next;
    +
    }
    +
    }
    +
    +
    /* Unpack and print samples for this trace segment */
    +
    if (printdata && seg->recordlist && seg->recordlist->first)
    +
    {
    +
    /* Determine sample size and type based on encoding of first record */
    +
    ms_encoding_sizetype (seg->recordlist->first->msr->encoding, &samplesize, &sampletype);
    +
    +
    /* Unpack data samples using record list.
    +
    * No data buffer is supplied, so it will be allocated and assigned to the segment.
    +
    * Alternatively, a user-specified data buffer can be provided here. */
    +
    unpacked = mstl3_unpack_recordlist (tid, seg, NULL, 0, verbose);
    +
    +
    if (unpacked != seg->samplecnt)
    +
    {
    +
    ms_log (2, "Cannot unpack samples for %s\n", tid->sid);
    +
    }
    +
    else
    +
    {
    +
    ms_log (0, "DATA (%" PRId64 " samples) of type '%c':\n", seg->numsamples, seg->sampletype);
    +
    +
    if (sampletype == 't')
    +
    {
    +
    printf ("%*s",
    +
    (seg->numsamples > INT_MAX) ? INT_MAX : (int)seg->numsamples,
    +
    (char *)seg->datasamples);
    +
    }
    +
    else
    +
    {
    +
    lines = (unpacked / 6) + 1;
    +
    +
    for (idx = 0, lineidx = 0; lineidx < lines; lineidx++)
    +
    {
    +
    for (col = 0; col < 6 && (int64_t)idx < seg->numsamples; col++)
    +
    {
    +
    sptr = (char *)seg->datasamples + (idx * samplesize);
    +
    +
    if (sampletype == 'i')
    +
    ms_log (0, "%10d ", *(int32_t *)sptr);
    +
    +
    else if (sampletype == 'f')
    +
    ms_log (0, "%10.8g ", *(float *)sptr);
    +
    +
    else if (sampletype == 'd')
    +
    ms_log (0, "%10.10g ", *(double *)sptr);
    +
    +
    idx++;
    +
    }
    +
    ms_log (0, "\n");
    +
    +
    if (printdata == 'd')
    +
    break;
    +
    }
    +
    }
    +
    }
    +
    }
    +
    +
    seg = seg->next;
    +
    }
    +
    +
    tid = tid->next[0];
    +
    }
    +
    +
    /* Make sure everything is cleaned up */
    +
    if (mstl)
    +
    mstl3_free (&mstl, 0);
    +
    +
    return 0;
    +
    }
    +
    #define MSF_RECORDLIST
    [TraceList] Build a MS3RecordList for each MS3TraceSeg
    Definition libmseed.h:1468
    +
    int ms3_readtracelist(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags, int8_t verbose)
    Read miniSEED from a file into a trace list.
    Definition fileutils.c:587
    +
    int16_t encoding
    Data encoding format, see Data Encodings.
    Definition libmseed.h:368
    +
    nstime_t starttime
    Record start time (first sample)
    Definition libmseed.h:366
    +
    struct MS3RecordPtr * next
    Pointer to next entry, NULL if the last.
    Definition libmseed.h:500
    +
    int64_t fileoffset
    Offset into file to record for fileptr or filename.
    Definition libmseed.h:495
    +
    const char * filename
    Pointer to file name containing record, NULL if not used.
    Definition libmseed.h:494
    +
    MS3RecordPtr * first
    Pointer to first entry, NULL if the none.
    Definition libmseed.h:507
    +
    MS3Record * msr
    Pointer to MS3Record for this record.
    Definition libmseed.h:496
    +
    const char * bufferptr
    Pointer in buffer to record, NULL if not used.
    Definition libmseed.h:492
    +
    FILE * fileptr
    Pointer to open FILE containing record, NULL if not used.
    Definition libmseed.h:493
    +
    nstime_t endtime
    End time of record, time of last sample.
    Definition libmseed.h:497
    +
    A miniSEED record pointer and metadata.
    Definition libmseed.h:491
    +
    struct MS3RecordList * recordlist
    List of pointers to records that contributed.
    Definition libmseed.h:558
    +
    void * datasamples
    Data samples, numsamples of type sampletype.
    Definition libmseed.h:553
    +
    int64_t samplecnt
    Number of samples in trace coverage.
    Definition libmseed.h:552
    +
    int64_t mstl3_unpack_recordlist(MS3TraceID *id, MS3TraceSeg *seg, void *output, uint64_t outputsize, int8_t verbose)
    Unpack data samples in a Record List associated with a MS3TraceList.
    Definition tracelist.c:1651
    +
    int ms_encoding_sizetype(uint8_t encoding, uint8_t *samplesize, char *sampletype)
    Return sample size and/or type for given encoding value.
    Definition lookup.c:74
    +

    +Reading from memory buffers

    +

    Read miniSEED from memory buffers. In this case a file is read into a buffer simply to illustrate reading from a buffer. In practice this would functionality would be used with data received via a network connection or some other, non-file, mechanism.

    +
    /***************************************************************************
    +
    * A program illustrating reading miniSEED from buffers
    +
    *
    +
    * This file is part of the miniSEED Library.
    +
    *
    +
    * Copyright (c) 2023 Chad Trabant, EarthScope Data Services
    +
    *
    +
    * Licensed under the Apache License, Version 2.0 (the "License");
    +
    * you may not use this file except in compliance with the License.
    +
    * You may obtain a copy of the License at
    +
    *
    +
    * http://www.apache.org/licenses/LICENSE-2.0
    +
    *
    +
    * Unless required by applicable law or agreed to in writing, software
    +
    * distributed under the License is distributed on an "AS IS" BASIS,
    +
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +
    * See the License for the specific language governing permissions and
    +
    * limitations under the License.
    +
    ***************************************************************************/
    +
    +
    #include <errno.h>
    +
    #include <stdio.h>
    +
    #include <sys/stat.h>
    +
    +
    #include <libmseed.h>
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    struct stat sb = {0};
    +
    int64_t records = 0;
    +
    FILE *fh;
    +
    +
    MS3TraceList *mstl = NULL;
    +
    char *buffer = NULL;
    +
    uint64_t bufferlength = 0;
    +
    int8_t splitversion = 0;
    +
    uint32_t flags = 0;
    +
    int8_t verbose = 0;
    +
    +
    if (argc != 2)
    +
    {
    +
    ms_log (2, "%s requires a single file name argument\n", argv[0]);
    +
    return -1;
    +
    }
    +
    +
    /* Read specified file into buffer */
    +
    if (!(fh = fopen (argv[1], "rb")))
    +
    {
    +
    ms_log (2, "Error opening %s: %s\n", argv[1], strerror (errno));
    +
    return -1;
    +
    }
    +
    if (fstat (fileno (fh), &sb))
    +
    {
    +
    ms_log (2, "Error stating %s: %s\n", argv[1], strerror (errno));
    +
    return -1;
    +
    }
    +
    if (!(buffer = (char *)malloc (sb.st_size)))
    +
    {
    +
    ms_log (2, "Error allocating buffer of %" PRIsize_t " bytes\n",
    +
    (sb.st_size >= 0) ? (size_t)sb.st_size : 0);
    +
    return -1;
    +
    }
    +
    if (fread (buffer, sb.st_size, 1, fh) != 1)
    +
    {
    +
    ms_log (2, "Error reading file\n");
    +
    return -1;
    +
    }
    +
    +
    fclose (fh);
    +
    +
    bufferlength = sb.st_size;
    +
    +
    /* Set bit flags to validate CRC and unpack data samples */
    +
    flags |= MSF_VALIDATECRC;
    +
    flags |= MSF_UNPACKDATA;
    +
    +
    mstl = mstl3_init (NULL);
    +
    +
    if (!mstl)
    +
    {
    +
    ms_log (2, "Error allocating MS3TraceList\n");
    +
    return -1;
    +
    }
    +
    +
    /* Read all miniSEED in buffer, accumulate in MS3TraceList */
    +
    records = mstl3_readbuffer (&mstl, buffer, bufferlength,
    +
    splitversion, flags, NULL, verbose);
    +
    +
    if (records < 0)
    +
    {
    +
    ms_log (2, "Problem reading miniSEED from buffer: %s\n", ms_errorstr (records));
    +
    }
    +
    +
    /* Print summary */
    +
    mstl3_printtracelist (mstl, ISOMONTHDAY, 1, 1, 0);
    +
    +
    ms_log (1, "Total records: %" PRId64 "\n", records);
    +
    +
    /* Make sure everything is cleaned up */
    +
    if (mstl)
    +
    mstl3_free (&mstl, 0);
    +
    +
    free (buffer);
    +
    +
    return 0;
    +
    }
    +
    void mstl3_printtracelist(const MS3TraceList *mstl, ms_timeformat_t timeformat, int8_t details, int8_t gaps, int8_t versions)
    Print trace list summary information for a MS3TraceList.
    Definition tracelist.c:2157
    +
    int64_t mstl3_readbuffer(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, int8_t verbose)
    Parse miniSEED from a buffer and populate a MS3TraceList.
    Definition tracelist.c:853
    +
    MS3TraceList * mstl3_init(MS3TraceList *mstl)
    Initialize a MS3TraceList container.
    Definition tracelist.c:51
    +
    #define PRIsize_t
    A printf() macro for portably printing size_t values.
    Definition libmseed.h:69
    +

    +Reading files in parallel

    +

    Read miniSEED in parallel using re-entrant interfaces and POSIX threading.

    +
    /***************************************************************************
    +
    * A simple example of using libmseed to read miniSEED in parallel
    +
    * using re-entrant interfaces and POSIX threading.
    +
    *
    +
    * Windows is not supported.
    +
    *
    +
    * This file is part of the miniSEED Library.
    +
    *
    +
    * Copyright (c) 2023 Chad Trabant, EarthScope Data Services
    +
    *
    +
    * Licensed under the Apache License, Version 2.0 (the "License");
    +
    * you may not use this file except in compliance with the License.
    +
    * You may obtain a copy of the License at
    +
    *
    +
    * http://www.apache.org/licenses/LICENSE-2.0
    +
    *
    +
    * Unless required by applicable law or agreed to in writing, software
    +
    * distributed under the License is distributed on an "AS IS" BASIS,
    +
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +
    * See the License for the specific language governing permissions and
    +
    * limitations under the License.
    +
    ***************************************************************************/
    +
    +
    #include <errno.h>
    +
    #include <stdio.h>
    +
    #include <stdlib.h>
    +
    #include <string.h>
    +
    #include <time.h>
    +
    +
    #include <libmseed.h>
    +
    +
    /* File read test portability, possibly in the future */
    +
    #if defined(LMP_WIN)
    +
    #define _access access
    +
    #define R_OK 4 /* Test for read permission */
    +
    #else
    +
    #include <pthread.h>
    +
    #include <unistd.h>
    +
    #endif
    +
    +
    #define VERSION "[libmseed " LIBMSEED_VERSION " example]"
    +
    #define PACKAGE "lm_pararead"
    +
    +
    static int8_t verbose = 0;
    +
    static int8_t printrecs = 0;
    +
    static uint32_t readflags = 0;
    +
    +
    /* File information structure */
    +
    typedef struct FileEntry
    +
    {
    +
    char *filename;
    +
    pthread_t tid;
    +
    MS3TraceList *mstl;
    +
    uint64_t recordcount;
    +
    int result;
    +
    struct FileEntry *next;
    +
    } FileEntry;
    +
    +
    /* List of files to read */
    +
    static FileEntry *files = NULL;
    +
    +
    /* Thread function to read miniSEED file */
    +
    static void *ReadMSFileThread (void *vfe)
    +
    {
    +
    FileEntry *fe = (FileEntry *)vfe;
    +
    MS3FileParam *msfp = NULL;
    +
    MS3Record *msr = NULL;
    +
    +
    /* NOTE: This example is contrived for illustration.
    +
    * The combination of ms3_readmsr_r() with mstl3_addmsr()
    +
    * is only needed if you wish to do something for each record.
    +
    * Otherwise, consider using ms3_readtracelist() if only
    +
    * a MS3TraceList is desired.*/
    +
    +
    /* Loop over the input file record by record */
    +
    while ((fe->result = ms3_readmsr_r (&msfp, &msr,
    +
    fe->filename,
    +
    readflags, verbose)) == MS_NOERROR)
    +
    {
    +
    fe->recordcount++;
    +
    +
    if (printrecs > 0)
    +
    msr3_print (msr, printrecs - 1);
    +
    +
    /* Add record to trace list */
    +
    if (mstl3_addmsr (fe->mstl, msr, 0, 1, 0, NULL) == NULL)
    +
    {
    +
    ms_log (2, "Error adding record to list\n");
    +
    fe->result = 1;
    +
    }
    +
    }
    +
    +
    /* Make sure everything is cleaned up */
    +
    ms3_readmsr_r (&msfp, &msr, NULL, 0, 0);
    +
    +
    return NULL;
    +
    }
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    FileEntry *fe = NULL;
    +
    int idx;
    +
    +
    /* Simplistic argument parsing */
    +
    for (idx = 1; idx < argc; idx++)
    +
    {
    +
    if (strncmp (argv[idx], "-v", 2) == 0)
    +
    verbose += strspn (&argv[idx][1], "v");
    +
    else if (strncmp (argv[idx], "-p", 2) == 0)
    +
    printrecs += strspn (&argv[idx][1], "p");
    +
    else
    +
    {
    +
    /* Add read-able files to file entry list */
    +
    if (access(argv[idx], R_OK) == 0)
    +
    {
    +
    if ((fe = (FileEntry *)malloc(sizeof(FileEntry))) == NULL)
    +
    {
    +
    ms_log (2, "Error allocating memory");
    +
    return -1;
    +
    }
    +
    +
    fe->filename = argv[idx];
    +
    fe->mstl = mstl3_init(NULL);
    +
    fe->recordcount = 0;
    +
    fe->result = 0;
    +
    fe->next = files;
    +
    +
    files = fe;
    +
    }
    +
    else
    +
    {
    +
    ms_log (2, "Cannot find file: %s\n", argv[idx]);
    +
    return -1;
    +
    }
    +
    }
    +
    }
    +
    +
    /* Make sure input file(s) specified */
    +
    if (!files)
    +
    {
    +
    ms_log (1, "No input file(s) specified\n\n");
    +
    ms_log (1, "%s version %s\n\n", PACKAGE, VERSION);
    +
    ms_log (1, "Read specified miniSEED files in parallel\n\n");
    +
    ms_log (1, "Usage: %s [-p] [-v] file1 [file2 .. fileN]\n", PACKAGE);
    +
    ms_log (1, " -v Be more verbose, multiple flags can be used\n");
    +
    ms_log (1, " -p Print record details, multiple flags can be used\n\n");
    +
    return 0;
    +
    }
    +
    +
    /* Report the program version */
    +
    if (verbose)
    +
    ms_log (1, "%s version: %s\n", PACKAGE, VERSION);
    +
    +
    /* Add program name and version to User-Agent for URL-based requests */
    +
    if (libmseed_url_support() && ms3_url_useragent(PACKAGE, VERSION))
    +
    return -1;
    +
    +
    /* Set flag to validate CRCs when reading */
    +
    readflags |= MSF_VALIDATECRC;
    +
    +
    /* Parse byte range from file/URL path name if present */
    +
    readflags |= MSF_PNAMERANGE;
    +
    +
    /* Create a thread to read each file */
    +
    for (fe = files; fe; fe = fe->next)
    +
    {
    +
    pthread_create (&(fe->tid), NULL, ReadMSFileThread, fe);
    +
    }
    +
    +
    /* Wait for threads to finish */
    +
    for (fe = files; fe; fe = fe->next)
    +
    {
    +
    pthread_join(fe->tid, NULL);
    +
    }
    +
    +
    /* Report details for each file */
    +
    for (fe = files; fe; fe = fe->next)
    +
    {
    +
    ms_log (0, "%s: records: %" PRIu64" result: %d\n",
    +
    fe->filename, fe->recordcount, fe->result);
    +
    +
    if (fe->result == MS_NOERROR || fe->result == MS_ENDOFFILE)
    +
    mstl3_printtracelist (fe->mstl, ISOMONTHDAY, 1, 1, 0);
    +
    }
    +
    +
    return 0;
    +
    } /* End of main() */
    +
    int ms3_readmsr_r(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose)
    Read miniSEED records from a file or URL in a thread-safe way.
    Definition fileutils.c:144
    +
    State container for reading miniSEED records from files or URLs.
    Definition libmseed.h:718
    +
    #define MS_ENDOFFILE
    End of file reached return value.
    Definition libmseed.h:1442
    +
    #define mstl3_addmsr(mstl, msr, splitversion, autoheal, flags, tolerance)
    Add a MS3Record to a MS3TraceList.
    Definition libmseed.h:628
    +

    +Writing miniSEED

    +

    An example of creating miniSEED. Static data with known signal is used for input for illustration and testing.

    +
    /***************************************************************************
    +
    * A program for libmseed packing tests.
    +
    *
    +
    * This file is part of the miniSEED Library.
    +
    *
    +
    * Copyright (c) 2023 Chad Trabant, EarthScope Data Services
    +
    *
    +
    * Licensed under the Apache License, Version 2.0 (the "License");
    +
    * you may not use this file except in compliance with the License.
    +
    * You may obtain a copy of the License at
    +
    *
    +
    * http://www.apache.org/licenses/LICENSE-2.0
    +
    *
    +
    * Unless required by applicable law or agreed to in writing, software
    +
    * distributed under the License is distributed on an "AS IS" BASIS,
    +
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +
    * See the License for the specific language governing permissions and
    +
    * limitations under the License.
    +
    ***************************************************************************/
    +
    +
    #include <errno.h>
    +
    #include <stdio.h>
    +
    #include <stdlib.h>
    +
    #include <string.h>
    +
    #include <time.h>
    +
    +
    #include <libmseed.h>
    +
    +
    #define VERSION "[libmseed " LIBMSEED_VERSION " example]"
    +
    #define PACKAGE "lm_pack"
    +
    +
    static flag verbose = 0;
    +
    static int reclen = -1;
    +
    static int encoding = 10;
    +
    static int msformat = 3;
    +
    static char *outfile = NULL;
    +
    +
    static int parameter_proc (int argcount, char **argvec);
    +
    static void usage (void);
    +
    +
    /****************************************************************************
    +
    * An expanding sinusoid of 500 samples.
    +
    *
    +
    * When truncated to integers:
    +
    * - Signed differences in samples needing all bit lengths 3-31s.
    +
    * - ONLY the last difference requires 31 bits, all others are <= 30
    +
    * - Contain sequences of differences matching all Steim 1 and 2 encoding possibilities
    +
    *
    +
    * Values 1 through up to 220 do not require more than 16-bits.
    +
    ***************************************************************************/
    +
    #define SINE_DATA_SAMPLES 500
    +
    static float fsinedata[SINE_DATA_SAMPLES] =
    +
    {0.000000,6.109208,10.246826,10.609957,6.764728,-0.075704,-7.409461,-12.346208,
    +
    -12.731430,-8.062958,0.182060,8.985442,14.875067,15.276420,9.609196,-0.328370,
    +
    -10.895428,-17.921131,-18.329336,-11.450576,0.526448,13.209973,21.590023,21.991385,
    +
    13.643140,-0.791247,-16.014492,-26.008907,-26.383901,-16.253504,1.141655,19.412378,
    +
    31.330871,31.652348,19.360848,-1.601465,-23.528777,-37.740204,-37.971107,-23.059260,
    +
    2.200591,28.515156,45.458753,45.549217,27.460529,-2.976569,-34.554817,-54.753559,
    +
    -54.637244,-32.697448,3.976416,41.869576,65.946052,65.535525,38.927729,-5.258928,
    +
    -50.727832,-79.423116,-78.604029,-46.338644,6.897516,61.454325,95.650397,94.274177,
    +
    55.152523,-8.983716,-74.441929,-115.188314,-113.063003,-65.633259,11.631511,
    +
    90.165916,138.711322,135.590105,78.094013,-14.982665,-109.201193,-167.031082,
    +
    -162.597954,-92.906331,19.213290,132.243134,201.124338,194.976222,110.510935,
    +
    -24.541940,-160.132765,-242.166440,-233.790899,-131.430478,31.239561,193.887193,
    +
    291.571675,280.319178,156.284630,-39.641741,-234.736391,-351.041770,-336.091216,
    +
    -185.807912,50.163757,284.167632,422.624233,402.940140,220.870763,-63.319072,
    +
    -343.979194,-508.782510,-483.061913,-262.504429,79.742042,416.345244,612.480366,
    +
    579.087014,311.930343,-100.215795,-503.894220,-737.283353,-694.166245,-370.594813,
    +
    125.706429,609.803540,887.480834,832.073438,440.209940,-157.404955,-737.913996,
    +
    -1068.232708,-997.328409,-522.801872,196.778712,892.867950,1285.745847,1195.344115,
    +
    620.767701,-245.634371,-1080.276240,-1547.486227,-1432.602775,-736.942489,
    +
    306.195102,1306.919790,1862.433994,1716.866654,874.678227,-381.195062,-1580.993078,
    +
    -2241.390126,-2057.430298,-1037.936774,473.995052,1912.398180,2697.345105,2465.422369,
    +
    1231.399220,-588.724017,-2313.099844,-3245.922143,-2954.166800,-1460.594493,
    +
    730.452133,2797.554253,3905.910007,3539.614901,1732.050527,-905.402443,-3383.226729,
    +
    -4699.903513,-4240.862333,-2053.471832,1121.209554,4091.216806,5655.073452,
    +
    5080.767553,2433.947965,-1387.235765,-4947.012887,-6804.092030,-6086.691631,
    +
    -2884.198121,1714.957253,5981.403297,8186.245216,7291.383170,3416.857907,-2118.435721,
    +
    -7231.576094,-9848.769674,-8734.036728,-4046.815355,2614.894255,8742.446660,
    +
    11848.459577,10461.558685,4791.604321,-3225.420222,-10568.260176,-14253.597692,
    +
    -12530.081077,-5671.864737,3975.823020,12774.525771,17146.276092,15006.771888,
    +
    6711.880612,-4897.680529,-15440.350897,-20625.184991,-17971.999652,-7940.208402,
    +
    6029.615451,18661.258563,24808.964001,21521.921578,9390.410233,-7418.851697,
    +
    -22552.587165,-29840.229074,-25771.577789,-11101.908663,9123.111793,27253.593143,
    +
    35890.411153,30858.590420,13120.982075,-11212.929535,-32932.401520,-43165.569941,
    +
    -36947.585456,-15501.922592,13774.468128,39791.979238,51913.378983,44235.478131,
    +
    18308.381438,-16912.953578,-48077.342225,-62431.517747,-52957.790070,-21614.930138,
    +
    20756.856764,58084.250586,75077.753677,63396.198979,25508.869716,-25462.986446,
    +
    -70169.698634,-90282.054065,-75887.560674,-30092.324242,31222.690356,84764.569627,
    +
    108561.135815,90834.689747,35484.659605,-38269.404043,-102388.901147,-130535.943080,
    +
    -108719.240618,-41825.273267,46887.838631,123670.298781,156952.641109,130117.096987,
    +
    49276.805933,-57425.161274,-149366.146307,-188707.832667,-155716.756615,-58028.831480,
    +
    70304.598043,180390.393831,226878.845103,186341.292651,68302.086980,-86041.981200,
    +
    -217845.865904,-272760.106197,-222974.585037,-80353.310040,105265.874749,
    +
    263063.225186,327906.831053,266792.649626,94480.755768,-128742.047924,-317647.960457,
    +
    -394187.487304,-319201.052420,-111030.470003,157403.231090,383537.048821,
    +
    473846.799900,381879.586964,130403.398591,-192385.288422,-463067.280664,
    +
    -569581.409624,-456835.620147,-153063.413757,235071.184227,559057.643966,
    +
    684630.722900,546467.782541,179546.337116,-287144.413901,-674908.656359,-822885.998573,
    +
    -653642.002301,-210470.033463,350653.927224,814722.125712,989021.327043,781782.266485,
    +
    246545.638548,-428093.004245,-983445.533844,-1188650.888674,-934978.952245,
    +
    -288589.965744,522495.068481,1187046.097893,1428517.756157,1118118.116795,
    +
    337539.108116,-637550.058001,-1432720.599829,-1716720.558561,-1337035.786123,
    +
    -394463.210730,777745.745791,1729148.322568,2062985.588205,1598702.057951,
    +
    460582.328770,-948539.335064,-2086795.934450,-2478993.447111,-1911440.758239,
    +
    -537283.204837,1156565.787585,2518284.974613,2978771.147961,2285191.490698,
    +
    626136.686773,-1409890.715316,-3038834.772892,-3579162.765425,-2731822.228828,
    +
    -728915.356799,1718317.328563,3666796.264850,4300394.349825,3265502.159830,
    +
    847610.742696,-2093758.948552,-4424295.326464,-5166751.952850,-3903146.346575,
    +
    -984449.218292,2550691.033230,5338008.063395,6207395.378498,4664945.984099,
    +
    1141905.356234,-3106699.622013,-6440095.078674,-7457334.785992,-5575000.657492,
    +
    -1322711.048944,3783146.686785,7769327.268660,8958602.684417,6662072.138144,
    +
    1529858.136359,-4605977.214406,-9372442.351616,-10761660.350202,-7960482.979376,
    +
    -1766591.537123,5606698.099533,11305779.346088,12927085.482769,9511187.602536,
    +
    2036388.930375,-6823565.288237,-13637247.864482,-15527597.247686,-11363048.833756,
    +
    -2342921.824577,8303023.316062,16448700.704063,18650486.048610,13574359.117581,
    +
    2689991.311114,-10101450.710498,-19838792.204081,-22400528.788313,-16214653.084049,
    +
    -3081429.850680,12287276.018778,23926421.676653,26903486.467518,19366867.002831,
    +
    3520957.976311,-14943542.889821,-28854881.491245,-32310300.258257,-23129911.185536,
    +
    -4011981.690190,18171019.183242,34796853.797034,38802125.311214,27621733.908111,
    +
    4557312.422997,-22091965.102165,-41960429.245394,-46596369.274924,-32982970.290335,
    +
    -5158786.517383,26854699.579994,50596356.438136,55953935.730766,39381287.228525,
    +
    5816755.047390,-32639133.476996,-61006773.393892,-67187912.573574,-47016556.451947,
    +
    -6529407.091211,39663473.627686,73555723.560159,80673993.102082,56127012.680548,
    +
    7291879.963058,-48192344.715084,-88681820.564997,-96862974.793882,-66996583.433046,
    +
    -8095097.920129,58546627.892657,106913500.120816,116295749.303753,79963612.136585,
    +
    8924265.924556,-71115377.915425,-128887386.814358,-139621279.391140,
    +
    -95431237.847443,-9756926.457174,86370256.557591,155370411.011265,167618156.945886,
    +
    113879744.320966,10560464.285645,-104883012.041142,-187286440.462195,
    +
    -201220454.267134,-135881249.803956,-11288915.420918,127346645.407973,
    +
    225748346.861610,241548722.121826,162117178.463787,11878900.943144,
    +
    -154601039.263161,-272096614.921471,-289947157.492990,-193399036.824020,
    +
    -12244462.331299,187663986.962885,327945826.905572,348028166.863781,
    +
    230693116.321629,12270520.408649,-227768756.995135,-395240626.753420,
    +
    -417725794.004062,-275149858.943091,-11804612.586023,276409565.108355,
    +
    476323094.198962,501359772.474058,328138760.150134,10646479.758475,
    +
    -335396614.264246,-574013851.836865,-601712311.942546,-391289845.886545,
    +
    -8534971.317913,406922710.094078,691709700.348455,722120145.317499,
    +
    466542952.987464,5131609.783276,-493643879.751773,-833501145.234545,
    +
    -866584864.231526,-556206270.243475,0.00000};
    +
    +
    static char *textdata =
    +
    "I've seen things you people wouldn't believe. Attack ships on fire off the shoulder of Orion. "
    +
    "I watched C-beams glitter in the dark near the Tannhäuser Gate. All those moments will be lost "
    +
    "in time, like tears...in...rain. Time to die.";
    +
    +
    /* Binary I/O for Windows platforms */
    +
    #ifdef LMP_WIN
    +
    #include <fcntl.h>
    +
    unsigned int _CRT_fmode = _O_BINARY;
    +
    #endif
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    MS3Record *msr = NULL;
    +
    uint32_t flags = 0;
    +
    int32_t sinedata[SINE_DATA_SAMPLES];
    +
    double dsinedata[SINE_DATA_SAMPLES];
    +
    int idx;
    +
    int rv;
    +
    +
    /* Create integer and double sine data sets */
    +
    for (idx = 0; idx < SINE_DATA_SAMPLES; idx++)
    +
    {
    +
    sinedata[idx] = (int32_t)(fsinedata[idx]);
    +
    dsinedata[idx] = (double)(fsinedata[idx]);
    +
    }
    +
    +
    /* Process command line arguments */
    +
    if (parameter_proc (argc, argv) < 0)
    +
    return -1;
    +
    +
    +
    if (!(msr = msr3_init (msr)))
    +
    {
    +
    ms_log (2, "Could not allocate MS3Record, out of memory?\n");
    +
    return -1;
    +
    }
    +
    +
    /* Set up record parameters */
    +
    strcpy (msr->sid, "FDSN:XX_TEST__X_Y_Z");
    +
    msr->reclen = reclen;
    +
    msr->pubversion = 1;
    +
    msr->starttime = ms_timestr2nstime ("2012-01-01T00:00:00");
    +
    msr->samprate = 1.0;
    +
    msr->encoding = encoding;
    +
    +
    if (encoding == DE_TEXT)
    +
    {
    +
    msr->numsamples = strlen (textdata);
    +
    msr->datasamples = textdata;
    +
    msr->sampletype = 't';
    +
    }
    +
    else if (encoding == DE_FLOAT32)
    +
    {
    +
    msr->numsamples = SINE_DATA_SAMPLES;
    +
    msr->datasamples = fsinedata;
    +
    msr->sampletype = 'f';
    +
    }
    +
    else if (encoding == DE_FLOAT64)
    +
    {
    +
    msr->numsamples = SINE_DATA_SAMPLES;
    +
    msr->datasamples = dsinedata;
    +
    msr->sampletype = 'd';
    +
    }
    +
    else if (encoding == DE_INT16)
    +
    {
    +
    msr->numsamples = 220; /* The first 220 samples can be represented in 16-bits */
    +
    msr->datasamples = sinedata;
    +
    msr->sampletype = 'i';
    +
    }
    +
    else if (encoding == DE_INT32)
    +
    {
    +
    msr->numsamples = SINE_DATA_SAMPLES;
    +
    msr->datasamples = sinedata;
    +
    msr->sampletype = 'i';
    +
    }
    +
    else if (encoding == DE_STEIM1)
    +
    {
    +
    msr->numsamples = SINE_DATA_SAMPLES;
    +
    msr->datasamples = sinedata;
    +
    msr->sampletype = 'i';
    +
    }
    +
    else if (encoding == DE_STEIM2)
    +
    {
    +
    msr->numsamples = SINE_DATA_SAMPLES - 1; /* Steim-2 can represent all but the last difference */
    +
    msr->datasamples = sinedata;
    +
    msr->sampletype = 'i';
    +
    }
    +
    else
    +
    {
    +
    ms_log (2, "Unsupported encoding: %d\n", encoding);
    +
    return -1;
    +
    }
    +
    +
    msr->samplecnt = msr->numsamples;
    +
    +
    /* Set data flush flag */
    +
    flags |= MSF_FLUSHDATA;
    +
    +
    /* Set miniSEED v2 if requested */
    +
    if (msformat == 2)
    +
    flags |= MSF_PACKVER2;
    +
    +
    rv = msr3_writemseed (msr, outfile, 1, flags, verbose);
    +
    +
    if (rv < 0)
    +
    ms_log (2, "Error (%d) writing miniSEED to %s\n", rv, outfile);
    +
    +
    /* Make sure everything is cleaned up */
    +
    msr->datasamples = NULL;
    +
    msr3_free (&msr);
    +
    +
    return 0;
    +
    } /* End of main() */
    +
    +
    /***************************************************************************
    +
    * parameter_proc:
    +
    *
    +
    * Process the command line arguments.
    +
    *
    +
    * Returns 0 on success, and -1 on failure
    +
    ***************************************************************************/
    +
    static int
    +
    parameter_proc (int argcount, char **argvec)
    +
    {
    +
    int optind;
    +
    +
    /* Process all command line arguments */
    +
    for (optind = 1; optind < argcount; optind++)
    +
    {
    +
    if (strcmp (argvec[optind], "-V") == 0)
    +
    {
    +
    ms_log (1, "%s version: %s\n", PACKAGE, VERSION);
    +
    exit (0);
    +
    }
    +
    else if (strcmp (argvec[optind], "-h") == 0)
    +
    {
    +
    usage ();
    +
    exit (0);
    +
    }
    +
    else if (strncmp (argvec[optind], "-v", 2) == 0)
    +
    {
    +
    verbose += strspn (&argvec[optind][1], "v");
    +
    }
    +
    else if (strcmp (argvec[optind], "-F") == 0)
    +
    {
    +
    msformat = strtol (argvec[++optind], NULL, 10);
    +
    }
    +
    else if (strcmp (argvec[optind], "-r") == 0)
    +
    {
    +
    reclen = strtol (argvec[++optind], NULL, 10);
    +
    }
    +
    else if (strcmp (argvec[optind], "-e") == 0)
    +
    {
    +
    encoding = strtol (argvec[++optind], NULL, 10);
    +
    }
    +
    else if (strcmp (argvec[optind], "-o") == 0)
    +
    {
    +
    outfile = argvec[++optind];
    +
    }
    +
    else
    +
    {
    +
    ms_log (2, "Unknown option: %s\n", argvec[optind]);
    +
    exit (1);
    +
    }
    +
    }
    +
    +
    /* Make sure an outfile was specified */
    +
    if (!outfile)
    +
    {
    +
    ms_log (2, "No output file was specified\n\n");
    +
    ms_log (1, "Try %s -h for usage\n", PACKAGE);
    +
    exit (1);
    +
    }
    +
    +
    if (msformat != 2 && msformat != 3)
    +
    {
    +
    ms_log (1, "Specified format must be 2 or 3, version %d is not supported\n", msformat);
    +
    exit (1);
    +
    }
    +
    +
    /* Report the program version */
    +
    if (verbose)
    +
    ms_log (1, "%s version: %s\n", PACKAGE, VERSION);
    +
    +
    return 0;
    +
    } /* End of parameter_proc() */
    +
    +
    /***************************************************************************
    +
    * usage:
    +
    * Print the usage message and exit.
    +
    ***************************************************************************/
    +
    static void
    +
    usage (void)
    +
    {
    +
    fprintf (stderr, "%s version: %s\n\n", PACKAGE, VERSION);
    +
    fprintf (stderr, "Usage: %s [options] -o outfile\n\n", PACKAGE);
    +
    fprintf (stderr,
    +
    " ## Options ##\n"
    +
    " -V Report program version\n"
    +
    " -h Show this usage message\n"
    +
    " -v Be more verbose, multiple flags can be used\n"
    +
    " -F format Specify miniSEED version format, default is v3\n"
    +
    " -r bytes Specify maximum record length in bytes, default 4096\n"
    +
    " -e encoding Specify encoding format\n"
    +
    "\n"
    +
    " -o outfile Specify the output file, required\n"
    +
    "\n"
    +
    "This program packs static, test data into miniSEED\n"
    +
    "\n");
    +
    } /* End of usage() */
    +
    #define MSF_PACKVER2
    [Packing] Pack as miniSEED version 2 instead of 3
    Definition libmseed.h:1467
    +
    #define MSF_FLUSHDATA
    [Packing] Pack all available data even if final record would not be filled
    Definition libmseed.h:1466
    +
    #define DE_STEIM1
    Steim-1 compressed integers.
    Definition libmseed.h:1417
    +
    #define DE_FLOAT32
    32-bit float (IEEE)
    Definition libmseed.h:1415
    +
    #define DE_FLOAT64
    64-bit float (IEEE)
    Definition libmseed.h:1416
    +
    #define DE_TEXT
    Text encoding (UTF-8)
    Definition libmseed.h:1412
    +
    #define DE_STEIM2
    Steim-2 compressed integers.
    Definition libmseed.h:1418
    +
    #define DE_INT32
    32-bit integer
    Definition libmseed.h:1414
    +
    #define DE_INT16
    16-bit integer
    Definition libmseed.h:1413
    +
    int64_t msr3_writemseed(MS3Record *msr, const char *mspath, int8_t overwrite, uint32_t flags, int8_t verbose)
    Write miniSEED from an MS3Record container to a file.
    Definition fileutils.c:899
    +
    int32_t reclen
    Length of miniSEED record in bytes.
    Definition libmseed.h:359
    +
    double samprate
    Nominal sample rate as samples/second (Hz) or period (s)
    Definition libmseed.h:367
    +
    char sid[LM_SIDLEN]
    Source identifier as URN, max length LM_SIDLEN.
    Definition libmseed.h:363
    +
    uint8_t pubversion
    Publication version.
    Definition libmseed.h:369
    +
    MS3Record * msr3_init(MS3Record *msr)
    Initialize and return an MS3Record.
    Definition msrutils.c:44
    +
    void msr3_free(MS3Record **ppmsr)
    Free all memory associated with a MS3Record.
    Definition msrutils.c:89
    + +
    int8_t flag
    Definition libmseed.h:1343
    +

    +Writing miniSEED with rolling buffer

    +

    An example of creating miniSEED using a MS3TraceList as a rolling buffer of data. This pattern is useful for generating miniSEED in a streaming fashion for scenarios where holding all data in memory is not possible or practical. For example, very large data sets or continuous, streaming data.

    +

    An input file of miniSEED is used as a convenient data source. MS3Record containers can be constructed for any arbitrary data and follow the same pattern of record generation.

    +
    /***************************************************************************
    +
    * A program for illustrating the use of a Trace List as an
    +
    * intermediate, rolling buffer for production of data records.
    +
    *
    +
    * An input file of miniSEED is used as a convenient data source.
    +
    * MS3Records can be constructed for any arbitrary data and follow the
    +
    * same pattern of record generation.
    +
    *
    +
    * This file is part of the miniSEED Library.
    +
    *
    +
    * Copyright (c) 2023 Chad Trabant, EarthScope Data Services
    +
    *
    +
    * Licensed under the Apache License, Version 2.0 (the "License");
    +
    * you may not use this file except in compliance with the License.
    +
    * You may obtain a copy of the License at
    +
    *
    +
    * http://www.apache.org/licenses/LICENSE-2.0
    +
    *
    +
    * Unless required by applicable law or agreed to in writing, software
    +
    * distributed under the License is distributed on an "AS IS" BASIS,
    +
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +
    * See the License for the specific language governing permissions and
    +
    * limitations under the License.
    +
    ***************************************************************************/
    +
    +
    #include <stdio.h>
    +
    #include <sys/stat.h>
    +
    #include <errno.h>
    +
    +
    #include <libmseed.h>
    +
    +
    /***************************************************************************
    +
    *
    +
    * A simple record handler callback function that parses and prints records
    +
    *
    +
    ***************************************************************************/
    +
    void
    +
    record_handler (char *record, int reclen, void *handlerdata)
    +
    {
    +
    (void)handlerdata;
    +
    MS3Record *msr = NULL;
    +
    +
    if (!msr3_parse (record, reclen, &msr, 0, 0))
    +
    {
    +
    msr3_print (msr, 0);
    +
    }
    +
    else
    +
    {
    +
    fprintf (stderr, "%s() Error parsing record\n", __func__);
    +
    }
    +
    +
    msr3_free (&msr);
    +
    }
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    MS3Record *msr = NULL;
    +
    MS3TraceList *mstl = NULL;
    +
    char *inputfile = NULL;
    +
    uint32_t flags = 0;
    +
    int8_t verbose = 0;
    +
    int retcode;
    +
    +
    int64_t psamples;
    +
    int precords;
    +
    int reclen = 256; /* Desired maximum record length */
    +
    uint8_t encoding = DE_STEIM2; /* Desired data encoding */
    +
    +
    if (argc != 2)
    +
    {
    +
    ms_log (2, "Usage: %s <mseedfile>\n", argv[0]);
    +
    return 1;
    +
    }
    +
    +
    inputfile = argv[1];
    +
    +
    mstl = mstl3_init(NULL);
    +
    if (mstl == NULL)
    +
    {
    +
    ms_log (2, "Cannot allocate memory\n");
    +
    return 1;
    +
    }
    +
    +
    /* Set bit flags to validate CRC and unpack data samples */
    +
    flags |= MSF_VALIDATECRC;
    +
    flags |= MSF_UNPACKDATA;
    +
    +
    /* Loop over the input file as a source of data */
    +
    while ((retcode = ms3_readmsr (&msr, inputfile, flags, verbose)) == MS_NOERROR)
    +
    {
    +
    if (mstl3_addmsr (mstl, msr, 0, 1, flags, NULL) == NULL)
    +
    {
    +
    ms_log (2, "mstl2_addmsr() had problems\n");
    +
    break;
    +
    }
    +
    +
    /* Attempt to pack data in the Trace List buffer.
    +
    * Only filled, or complete, records will be generated. */
    +
    +
    ms_log (0, "Calling mstl3_pack() to generate records\n");
    +
    +
    precords = mstl3_pack (mstl, // Pack data in this trace list
    +
    record_handler, // Callback function that will handle records
    +
    NULL, // Callback function data, none in this case
    +
    reclen, // Maximum record length
    +
    encoding, // Data encoding
    +
    &psamples, // Packed sample count
    +
    flags, // Flags to control packing
    +
    verbose, // Verbosity
    +
    NULL // Extra headers to inject, none in this case
    +
    );
    +
    +
    ms_log (0, "mstl3_pack() created %d records containing %" PRId64 " samples\n",
    +
    precords, psamples);
    +
    }
    +
    +
    if (retcode != MS_ENDOFFILE)
    +
    ms_log (2, "Error reading %s: %s\n", inputfile, ms_errorstr (retcode));
    +
    +
    /* Final call to flush data buffers, adding MSF_FLUSHDATA flag */
    +
    ms_log (0, "Calling mstl3_pack() with MSF_FLUSHDATA flag\n");
    +
    +
    precords = mstl3_pack (mstl, // Pack data in this trace list
    +
    record_handler, // Callback function that will handle records
    +
    NULL, // Callback function data, none in this case
    +
    reclen, // Maximum record length
    +
    encoding, // Data encoding
    +
    &psamples, // Packed sample count
    +
    (flags | MSF_FLUSHDATA), // Flags to control packing, adding flush flag
    +
    verbose, // Verbosity
    +
    NULL // Extra headers to inject, none in this case
    +
    );
    +
    +
    ms_log (0, "Final mstl3_pack() created %d records containing %" PRId64 " samples\n",
    +
    precords, psamples);
    +
    +
    /* Make sure everything is cleaned up */
    +
    ms3_readmsr (&msr, NULL, flags, 0);
    +
    +
    if (msr)
    +
    msr3_free (&msr);
    +
    +
    if (mstl)
    +
    mstl3_free (&mstl, 0);
    +
    +
    return 0;
    +
    }
    +
    int msr3_parse(const char *record, uint64_t recbuflen, MS3Record **ppmsr, uint32_t flags, int8_t verbose)
    Parse miniSEED from a buffer.
    Definition parseutils.c:61
    +
    int64_t mstl3_pack(MS3TraceList *mstl, void(*record_handler)(char *, int, void *), void *handlerdata, int reclen, int8_t encoding, int64_t *packedsamples, uint32_t flags, int8_t verbose, char *extra)
    Pack MS3TraceList data into miniSEED records.
    Definition tracelist.c:1973
    +

    +Working with Source Identifiers

    +

    An example of mapping between source identifiers (SIDs) and SEED identifier codes.

    +
    /***************************************************************************
    +
    * A program illustrating mapping source identifiers and SEED codes
    +
    *
    +
    * This file is part of the miniSEED Library.
    +
    *
    +
    * Copyright (c) 2023 Chad Trabant, EarthScope Data Services
    +
    *
    +
    * Licensed under the Apache License, Version 2.0 (the "License");
    +
    * you may not use this file except in compliance with the License.
    +
    * You may obtain a copy of the License at
    +
    *
    +
    * http://www.apache.org/licenses/LICENSE-2.0
    +
    *
    +
    * Unless required by applicable law or agreed to in writing, software
    +
    * distributed under the License is distributed on an "AS IS" BASIS,
    +
    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    +
    * See the License for the specific language governing permissions and
    +
    * limitations under the License.
    +
    ***************************************************************************/
    +
    +
    #include <libmseed.h>
    +
    +
    int
    +
    map_sid (char *original_sid)
    +
    {
    +
    char sid[LM_SIDLEN];
    +
    char network[11];
    +
    char station[11];
    +
    char location[11];
    +
    char channel[31];
    +
    int rv;
    +
    +
    /* Parse network, station, location and channel from SID */
    +
    rv = ms_sid2nslc (original_sid, network, station, location, channel);
    +
    +
    if (rv)
    +
    {
    +
    printf ("Error returned ms_sid2nslc()\n");
    +
    return -1;
    +
    }
    +
    +
    /* Construct SID from network, station, location and channel */
    +
    rv = ms_nslc2sid (sid, sizeof(sid), 0, network, station, location, channel);
    +
    +
    if (rv <= 0)
    +
    {
    +
    printf ("Error returned ms_nslc2sid()\n");
    +
    return -1;
    +
    }
    +
    +
    printf ("Original SID: '%s'\n", original_sid);
    +
    printf (" network: '%s', station: '%s', location: '%s', channel: '%s'\n",
    +
    network, station, location, channel);
    +
    printf (" SID: '%s'\n", sid);
    +
    +
    return 0;
    +
    }
    +
    +
    int
    +
    main (int argc, char **argv)
    +
    {
    +
    char *sid;
    +
    int idx;
    +
    +
    sid = "FDSN:NET_STA_LOC_C_H_N";
    +
    +
    if (map_sid (sid))
    +
    {
    +
    printf ("Error with map_sid()\n");
    +
    return 1;
    +
    }
    +
    +
    /* Map each value give on the command line */
    +
    if (argc > 1)
    +
    {
    +
    for (idx = 1; idx < argc; idx++)
    +
    {
    +
    if (map_sid (argv[idx]))
    +
    {
    +
    printf ("Error with map_sid()\n");
    +
    return 1;
    +
    }
    +
    }
    +
    }
    +
    +
    return 0;
    +
    }
    +
    int ms_sid2nslc(const char *sid, char *net, char *sta, char *loc, char *chan)
    Parse network, station, location and channel from an FDSN Source ID.
    Definition genutils.c:183
    +
    int ms_nslc2sid(char *sid, int sidlen, uint16_t flags, const char *net, const char *sta, const char *loc, const char *chan)
    Convert network, station, location and channel to an FDSN Source ID.
    Definition genutils.c:314
    +
    #define LM_SIDLEN
    Length of source ID string.
    Definition libmseed.h:139
    +
    +
    + + + + + diff --git a/page-faq.html b/page-faq.html new file mode 100644 index 0000000..e112bb6 --- /dev/null +++ b/page-faq.html @@ -0,0 +1,151 @@ + + + + + + + +libmseed: Frequency asked questions + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    Frequency asked questions
    +
    +
    + +

    +FAQs

    +

    +How do I read/write data from/to files?

    +

    The short answer is to use ms3_readmsr(), ms3_readtracelist(), and ms3_writemsr(). You can find descriptions and code examples in the Tutorial and Examples sections.

    +

    +Can I read/write data from/to memory buffers?

    +

    Yes! Use msr3_parse() to read data from a memory buffer, and msr3_pack() to write data to a memory buffer. The msr3_pack() function accepts a callback function that is called when records are completed, from there the caller can do whatever is desired with the record.

    +

    +How do I read data from a URL?

    +

    The library includes support for reading from URLs using libcurl. To use this feature, the library must be compiled with LIBMSEED_URL defined, and the program must be linked with both this library and libcurl.

    +

    The stream/file reading functions in the library will automatically detect URLs versus local files and there is no need to do anything special to use this feature.

    +

    Specifics of the URL support can be configured with ms3_url_useragent(), ms3_url_userpassword(), and ms3_url_addheader().

    +

    To disable TLS/SSL peer and host verification set the LIBMSEED_SSL_NOVERIFY environment variable.

    +

    +miniSEED is simple, why is a library needed?

    +

    Indeed, a major advantage of miniSEED is that it is relatively simple. In specific cases, reading and even writing of miniSEED can a implemented with very little code. However, there are many combinations possible in record construction, data encodings, record lengths, proper time determination, endianess, etc. which make the general case non-trivial. With 2 versions of the format that are not binary compatible, the general case becomes even more complex.

    +

    Importantly, the library handles the task of re-assembling continuous time series data from independent, and arbitrarily organized, miniSEED records. This "beyond miniSEED" support no small task, and is required for most use cases.

    +

    Furthermore, the library contains optimizations for handling large volumes and highly-multiplexed data, as well efficiently dealing with historical quirks and data problems.

    +

    +Can I use libmseed strictly with miniSEED version 2?

    +

    Yes. The library is backwards compatible with miniSEED version 2, and will automatically detect the version of data being read. Version 2 records can be created by setting the MSF_PACKVER2 flag when calling the pack or write functions.

    +

    +I need to use separate FDSN identifiers of Network, Station, Location and Channel.

    +

    and what is the deal with this new Source Identifier?

    +

    In 2020 the FDSN approved the Source Identifier specification to overcome the limitations of SEED network, station, location, and channel codes. In particular length limitations, instrument-type code depletion, and provide a standard way to combine them. This specification is a superset of SEED codes and is backwards compatible as long as the codes are short enough to fit into SEED limitations.

    +

    As of major version 3, the library adopted the FDSN Source Identifer, often abbreviated to SID, replacing the previous representation that was very similar.

    +

    You can use the ms_sid2nslc() and ms_nslc2sid() routines to convert between the two representations.

    +

    Except for potentially larger individual codes, the major difference in the two representations is the channel code. In the SEED specification this is a fixed 3-character code, while in the FDSN Source Identifier specification the channel is 3 codes separated by underscores, with each code potentially being larger than a single character. The library is agnostic to form of a channel representation, accepting either and converting between them whenever possible and appropriate.

    +

    +The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?

    +

    Starting with major version 3 of the library the internal data model was changed to be based on miniSEED format version 3. This relatively large structural change required API changes, and the opportunity was taken To improve the API in other ways.

    +

    See the Guide for porting from earlier libmseed versions.

    +

    +I'm using the library and would like to cite it. How do I do that?

    +

    A publication is planned and will be added here when available.

    +

    For now, please cite the GitHub repository: https://github.com/EarthScope/libmseed

    +

    Thank you!

    +

    +This library sucks. What can I do?

    +

    It won't be everyone's cup of tea. Some alternative libraries are:

    +

    P. Crotwell's SeisFile - Java library with miniSEED support.

    +

    D. Neuhauser's Qlib2 - C library with miniSEED support.

    +

    (happy to add more here, please let me know!)

    +

    +This library is great, but doesn't do something I need. What can I do? How can I contribute?

    +

    Contributions of ideas, problems reports, and code are welcome!

    +

    Please post issues to the repository.

    +

    Code contributions are best submitted as pull requests.

    +
    +
    + + + + + diff --git a/page-tutorial.html b/page-tutorial.html new file mode 100644 index 0000000..6f645a9 --- /dev/null +++ b/page-tutorial.html @@ -0,0 +1,254 @@ + + + + + + + +libmseed: Tutorial + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + + +
    +
    +
    Tutorial
    +
    +
    + +

    +Common usage

    +

    This page contains a description of basic library usage for the most common usage cases.

    +

    Additionally, the Examples page contains full examples for common use cases, which are also included in the 'examples' directory of the source code distribution.

    +

    +Reading miniSEED data

    +

    A common task is to read a file of miniSEED records and perform some action based on the header values or apply some process to the data samples. There are two patterns to support this in the library, one to iterate over the file record-by-record and another to read all data into a collection of continuous series.

    +

    +Reading miniSEED records from files

    +

    The ms3_readmsr() routine will open a specified file and return MS3Record structures for each miniSEED record it reads from the file. Called iteratively in a loop, all records are returned in the order discovered.

    +

    A code snippet for reading miniSEED from a file record-by-record:

    int main ()
    +
    {
    +
    char *filename = "datafile.mseed";
    +
    MS3Record *msr = NULL;
    +
    uint32_t flags = MSF_SKIPNOTDATA & MSF_UNPACKDATA;
    +
    int verbose = 0;
    +
    int retcode;
    +
    +
    while ((retcode = ms3_readmsr (&msr, filename, flags, verbose)) == MS_NOERROR)
    +
    {
    +
    /* Do something with the record here, e.g. print */
    +
    msr3_print (msr, verbose);
    +
    }
    +
    +
    if (retcode != MS_ENDOFFILE)
    +
    ms_log (2, "Cannot read %s: %s\n", filename, ms_errorstr (retcode));
    +
    +
    /* Cleanup memory and close file */
    +
    ms3_readmsr (&msr, NULL, flags, verbose);
    +
    +
    return 0;
    +
    }
    +
    #define MSF_SKIPNOTDATA
    [Parsing] Skip input that cannot be identified as miniSEED
    Definition libmseed.h:1461
    +
    #define MSF_UNPACKDATA
    [Parsing] Unpack data samples
    Definition libmseed.h:1460
    +
    int ms3_readmsr(MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose)
    Read miniSEED records from a file or URL.
    Definition fileutils.c:117
    +
    #define ms_log(level,...)
    Wrapper for ms_rlog(), call as ms_log (level, format, ...)
    Definition libmseed.h:1160
    +
    void msr3_print(const MS3Record *msr, int8_t details)
    Print header values of an MS3Record.
    Definition msrutils.c:228
    +
    miniSEED record container
    Definition libmseed.h:357
    +
    #define MS_NOERROR
    No error.
    Definition libmseed.h:1443
    +
    #define MS_ENDOFFILE
    End of file reached return value.
    Definition libmseed.h:1442
    +
    const char * ms_errorstr(int errorcode)
    Descriptive string for library Return codes.
    Definition lookup.c:205
    +

    It is important to call ms3_readmsr() for cleanup as illustrated to free memory and close files.

    +

    There are more advanced versions of this routine. The ms3_readmsr_r() function is a thread-safe version that can be used in threaded programs to read files in parallel. The ms3_readmsr_selection() function is a thread-safe version that can additionally accept Data Selections to efficiently return only selected data.

    +

    +Reading miniSEED from files into traces lists

    +

    Another option is to read all miniSEED into a Trace List without any handling of records. This is done with ms3_readtraces(), which is very useful for quickly reading data for processing. The data are returned in ordered, continuous segments ready for processing.

    +

    A code snippet for reading miniSEED from a file into a Trace List :

    int main ()
    +
    {
    +
    char *filename1 = "datafile1.mseed";
    +
    char *filename2 = "datafile2.mseed";
    +
    MS3TraceList *mstl = NULL;
    + +
    uint32_t flags = MSF_SKIPNOTDATA & MSF_UNPACKDATA;
    +
    int verbose = 0;
    +
    int retcode;
    +
    +
    retcode = ms3_readtracelist (&mstl, filename1, &tol, 0, flags, verbose);
    +
    +
    if (retcode != MS_NOERROR)
    +
    ms_log (2, "Cannot read %s: %s\n", filename1, ms_errorstr (retcode));
    +
    +
    retcode = ms3_readtracelist (&mstl, filename2, &tol, 0, flags, verbose);
    +
    +
    if (retcode != MS_NOERROR)
    +
    ms_log (2, "Cannot read %s: %s\n", filename2, ms_errorstr (retcode));
    +
    +
    if (!mstl)
    +
    {
    +
    fprintf (stderr, "Error reading file\\n");
    +
    return -1;
    +
    }
    +
    +
    /* Do something with the traces here, e.g. print */
    +
    mstl3_printtracelist (mstl, 0, verbose, 0, 0);
    +
    +
    mstl3_free (&mstl, 1);
    +
    +
    return 0;
    +
    }
    +
    int ms3_readtracelist(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags, int8_t verbose)
    Read miniSEED from a file into a trace list.
    Definition fileutils.c:587
    +
    void mstl3_printtracelist(const MS3TraceList *mstl, ms_timeformat_t timeformat, int8_t details, int8_t gaps, int8_t versions)
    Print trace list summary information for a MS3TraceList.
    Definition tracelist.c:2157
    +
    void mstl3_free(MS3TraceList **ppmstl, int8_t freeprvtptr)
    Free all memory associated with a MS3TraceList.
    Definition tracelist.c:86
    +
    #define MS3Tolerance_INITIALIZER
    Initialializer for the tolerances MS3Tolerance.
    Definition libmseed.h:617
    +
    Container for a collection of continuous trace segment, linkable.
    Definition libmseed.h:578
    +
    Callback functions that return time and sample rate tolerances.
    Definition libmseed.h:610
    +

    There are more advanced versions of this routine. The ms3_readtracelist_timewin() function allows data to be limited to a specific time range while reading. The ms3_readtracelist_selection() can additionally accept Data Selections to efficiently return only selected data.

    +

    +Reading miniSEED from memory

    +

    If an application is not designed to read miniSEED from files the library provides functions functionality to read data from memory. The mstl3_readbuffer() function will read all data from a buffer into a Trace List. The low-level functions ms3_detect() and msr3_parse() can be used to detect and parse miniSEED records in memory buffers.

    +

    +Writing miniSEED records

    +

    Another common task is to create miniSEED records. There are two patterns to support this in the library: one is to write data from library containers to files and another to create records and provide them back to the caller in a memory buffer via a callback function.

    +

    +Callback design

    +

    If not writing directly to files, the packing interfaces use a callback design, where the caller specifies a function that will be called for every record that is created. It is the responsibility of the callback function to handle the record before returning. This design allows a program to do whatever is needed with generated miniSEED, i.e. write to files, send over the network, or even injection of more information.

    +

    +Writing miniSEED data to files

    +

    The library supports writing miniSEED directly to files from either MS3Record or MS3TraceList containers using msr3_writemseed() or mstl3_writemseed() respectively.

    +

    A code snippet for writing miniSEED to a file from an MS3Record using msr3_writemseed():

    int main()
    +
    {
    +
    int packedrecords;
    +
    int verbose = 0;
    +
    char *msfile = "output.mseed";
    +
    int32_t datasamples[] = {0,1,2,3,4,5,6,7,8,9,10};
    +
    MS3Record *msr;
    +
    +
    msr = msr3_init (NULL);
    +
    +
    /* Populate MS3Record values */
    +
    strcpy (msr->sid, "FDSN:XX_TEXT__B_H_E");
    +
    msr->reclen = 512;
    +
    msr->pubversion = 1;
    +
    msr->starttime = ms_timestr2nstime ("2018-12-01T00:00:00.000000000");
    +
    msr->samprate = 20.0;
    + +
    +
    msr->datasamples = datasamples; /* pointer to 32-bit integer data samples */
    +
    msr->numsamples = 11;
    +
    msr->sampletype = 'i'; /* declare data type to be 32-bit integers */
    +
    +
    /* Write all data in MS3Record to output file, using MSF_FLUSHDATA flag */
    +
    packedrecords = msr3_writemseed (msr, msfile, 1, MSF_FLUSHDATA, verbose);
    +
    +
    ms_log (0, "Wrote %d records to %s\n", packedrecords, msfile);
    +
    +
    /* Disconnect datasamples pointer, otherwise msr3_free() will attempt to free() it */
    +
    msr->datasamples = NULL;
    +
    +
    msr3_free (&msr);
    +
    }
    +
    #define MSF_FLUSHDATA
    [Packing] Pack all available data even if final record would not be filled
    Definition libmseed.h:1466
    +
    #define DE_STEIM2
    Steim-2 compressed integers.
    Definition libmseed.h:1418
    +
    int64_t msr3_writemseed(MS3Record *msr, const char *mspath, int8_t overwrite, uint32_t flags, int8_t verbose)
    Write miniSEED from an MS3Record container to a file.
    Definition fileutils.c:899
    +
    void * datasamples
    Data samples, numsamples of type sampletype.
    Definition libmseed.h:377
    +
    int32_t reclen
    Length of miniSEED record in bytes.
    Definition libmseed.h:359
    +
    double samprate
    Nominal sample rate as samples/second (Hz) or period (s)
    Definition libmseed.h:367
    +
    int64_t numsamples
    Number of data samples in datasamples.
    Definition libmseed.h:379
    +
    char sampletype
    Sample type code: t, i, f, d Sample Types.
    Definition libmseed.h:380
    +
    int16_t encoding
    Data encoding format, see Data Encodings.
    Definition libmseed.h:368
    +
    nstime_t starttime
    Record start time (first sample)
    Definition libmseed.h:366
    +
    char sid[LM_SIDLEN]
    Source identifier as URN, max length LM_SIDLEN.
    Definition libmseed.h:363
    +
    uint8_t pubversion
    Publication version.
    Definition libmseed.h:369
    +
    MS3Record * msr3_init(MS3Record *msr)
    Initialize and return an MS3Record.
    Definition msrutils.c:44
    +
    void msr3_free(MS3Record **ppmsr)
    Free all memory associated with a MS3Record.
    Definition msrutils.c:89
    + +

    +Creating miniSEED records

    +

    Records can be generated from data in either MS3Record or MS3TraceList containers using, respectively, msr3_pack() or and mstl3_pack().

    +
    +
    + + + + + diff --git a/pages.html b/pages.html new file mode 100644 index 0000000..114176c --- /dev/null +++ b/pages.html @@ -0,0 +1,88 @@ + + + + + + + +libmseed: Related Pages + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + +
    + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    Related Pages
    +
    +
    +
    Here is a list of all related documentation pages:
    +
    +
    + + + + + diff --git a/plus.svg b/plus.svg new file mode 100644 index 0000000..0752016 --- /dev/null +++ b/plus.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/plusd.svg b/plusd.svg new file mode 100644 index 0000000..0c65bfe --- /dev/null +++ b/plusd.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/porting-guide.html b/porting-guide.html new file mode 100644 index 0000000..19c77ac --- /dev/null +++ b/porting-guide.html @@ -0,0 +1,208 @@ + + + + + + + +libmseed: Guide for porting from earlier libmseed versions + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    Guide for porting from earlier libmseed versions
    +
    +
    + +

    +Overview and approach

    +

    This page contains a description of major API changes from version 2 to 3 of the library.

    +

    The recommended approach to porting is as follows:

    +
      +
    1. Read through the Most important changes that commonly need attention, changing anything in the calling program that is obvious.
    2. +
    3. Try compiling the target program with the new library and fix any identified problems.
    4. +
    5. Read Other changes that may need attention to understand other changes that may not be identified at compile time but may yet effect the program.
    6. +
    +

    +Most important changes that commonly need attention

    +
      +
    • Convert MSRecord structure type usage to MS3Record, which has similar (but not the same) members.
    • +
    • Convert MSTraceList, MSTraceID, and MSTraceSeg structure types usage to MS3TraceList, MS3TraceID, and MS3TraceSeg, which have similar (but not the same) members.
    • +
    • Convert usage of MSTraceGroups to MS3TraceList. Legacy "Trace Groups" are no longer supported. The Examples page contains examples of using Trace List functionality.
    • +
    • MS3TraceList.numtraces renamed to MS3TraceList.numtraceids.
    • +
    • The fpos and last arguments of ms3_readmsr(), ms3_readmsr_r(), and ms3_readmsr_selection() have been removed. The same capability is available using the re-entrant ('_r') functions with MS3FileParam (msfp)
        +
      • Stream/file position of returned record is (msfp->streampos - msr->reclen)
      • +
      • Starting position of a read can be set at msfp->startoffset
      • +
      • The last record read is identified by the return value of MS_ENDOFFILE
      • +
      +
    • +
    • Convert all hptime_t typed variables to nstime_t type.
      Note
      the nstime_t type is a nanosecond epoch value, whereas the previous hptime_t was a microsecond epoch value. Careful review is required for values used by a program directly (they really should not be).
      +
    • +
    • Review and change functions with hptime in the name to their closest equivalent for the new nstime version. See Time definitions and functions.
    • +
    • Change all usage of ms_hptime2isotimestr(), ms_hptime2mdtimestr(), and ms_hptime2seedtimestr() functions to use ms_nstime2timestr(), which has enumerated flags to specify the time string format. In general:
        +
      • ms_hptime2isotimestr() becomes ms_nstime2timestr(nstime, timestr, ISOMONTHDAY, subsecond)
      • +
      • ms_hptime2mdtimestr() becomes ms_nstime2timestr(nstime, timestr, ISOMONTHDAY_SPACE, subsecond)
      • +
      • ms_hptime2seedtimestr() becomes ms_nstime2timestr(nstime, timestr, SEEDORDINAL, subsecond)
      • +
      +
    • +
    • The time format and subseconds flags have changed from integers to enum values, review and change calling of ms_nstime2timestr(), mstl3_printtracelist(), mstl3_printsynclist(), and mstl3_printgaplist().
      Note
      If the above functions are simply renamed and the flag values are not changed to use the enumerated types, leaving integers as arguments, there may be a non-obvious bug. Most compilers will quiety accept an integer for the enum argument, which may or may not match the desired time format or subsecond handling. Assume not.
      +
    • +
    • Adapt to new identification of a record source. The channel identification has changed from NN_SSS_LL_CHA, commonly printed in library console output and logging, to a URI-style Source Identifier (SID) with the pattern FDSN:NN_SSS_LL_B_S_s. The following helper functions are available for mapping between the new URI-based scheme and the traditional SEED network, station, location, channel scheme: +
    • +
    • The new data model allows sampling rate to be specified in samples/second (Hertz) or sampling period (seconds). This is represented in the samprate values, such as MS3Record.samprate, as follows:

        +
      • samprate >= 0.0 is a rate in samples/second (Hertz)
      • +
      • samprate < 0.0 is a (negated) sampling period in seconds
      • +
      +

      It is common that rates equal to or greater than 1 Hz are represented in samples/second and rates less than 1 Hz are represented as a period.

      +

      Applications that must consistently have access to the samples/second representation may use the msr3_sampratehz() function.

      +
    • +
    +

    +Other changes that may need attention

    +
      +
    • The supported range for the internal time scale is reduced from year 5000 to year 2262 (due to the change in time resolution). If an application previously used the library with years beyond 2262, such programs should be adapted for this new limit.
    • +
    • The off_t type is no longer used by the library due to non-portable, inconsistent size. Instead, the int64_t type is used. Calling programs should adjust their usage accordingly. The API changed as follows: +
    • +
    • The flag typedef is now legacy, you may wish to convert to directly using int8_t
    • +
    • The time and sample rate tolerances, specified as timetol and sampratetol arguments, have been replaced with MS3Tolerance which identifies callback functions that return tolerances for a specified MS3Record.
    • +
    • The SEED 2.x data quality identifiers no longer exist in the new data model. The library maps these values to integer publications versions as follows:
        +
      • Quality R => 1
      • +
      • Quality D => 2
      • +
      • Quality Q => 3
      • +
      • Quality M => 4
      • +
      • Unknown quality => 0
      • +
      +
    • +
    • For applications that need access to flags in the miniSEED 2.x fixed header, they have moved to the following locations:

        +
      • Activity flags (field 12):
          +
        • Bit 0 (calibration signals present) => Fixed header flags, bit 0
        • +
        • Bit 1 (time correction applied), not retained
        • +
        • Bit 2 (begining of event) => Extra header FDSN.Event.Begin
        • +
        • Bit 3 (end of event) => Extra header FDSN.Event.End
        • +
        • Bit 4 (positive leap second included) => Extra header FDSN.Time.LeapSecond
        • +
        • Bit 5 (negative leap second included) => Extra header FDSN.Time.LeapSecond
        • +
        • Bit 6 (event in progress) => Extra header FDSN.Event.InProgress
        • +
        +
      • +
      • I/O flags (field 13):
          +
        • Bit 0 (Station volume parity error) => Extra header FDSN.Flags.StationVolumeParityError
        • +
        • Bit 1 (Long record read) => Extra header FDSN.Flags.LongRecordRead
        • +
        • Bit 2 (Short record read) => Extra header FDSN.Flags.ShortRecordRead
        • +
        • Bit 3 (Start of time series) => Extra header FDSN.Flags.StartOfTimeSeries
        • +
        • Bit 4 (End of time series) => Extra header FDSN.Flags.EndOfTimeSeries
        • +
        • Bit 5 (Clock locked) => Fixed header flags, bit 2
        • +
        +
      • +
      • Data quality flags (field 14):
          +
        • Bit 0 (Amplifier saturation detected) => Extra header FDSN.Flags.AmplifierSaturation
        • +
        • Bit 1 (Digitizer clipping detected) => Extra header FDSN.Flags.DigitizerClipping
        • +
        • Bit 2 (Spikes detected) => Extra header FDSN.Flags.Spikes
        • +
        • Bit 3 (Glitches detected) => Extra header FDSN.Flags.Glitches
        • +
        • Bit 4 (Missing/padded data present) => Extra header FDSN.Flags.MissingData
        • +
        • Bit 5 (Telemetry synchronization error) => Extra header FDSN.Flags.TelemetrySyncError
        • +
        • Bit 6 (Digital filter may be charging) => Extra header FDSN.Flags.FilterCharging
        • +
        • Bit 7 (Time tag questionable) => Fixed header flags, bit 1
        • +
        +
      • +
      +

      The existence of these boolean extra header values can be tested with mseh_exists().

      +
    • +
    +

    +Ramifications for change in data model

    +

    With an internal change in the data model, from miniSEED 2 to version 3, results in the following consequences:

    +
      +
    • Version 2.x data quality indicators (D, R, Q and M) are no longer supported. These are mapped to version 3 publication versions.
    • +
    • Version 2.x beam blockettes (400 & 405) are no longer supported, they will be dropped if reading records that contain such blockettes.
    • +
    • Version 2.x opaque blockettes (2000) are no longer supported, they will be dropped if reading records that contain such blockettes. Note that the format version 3 Extra Headers functionality can be used to contain most arbitrary data.
    • +
    • Version 2.x timing blockettes (500) contain one "Clock Model" designation per blockette, potentially allowing for multiple designations in a single record. Upon reading such a record, only the last clock model is retained (in the FDSN.Clock.Model Extra Headers).
    • +
    • Version 2.x sequence numbers, as six digit ASCII string, are not retained. In the new format these values may be placed in Extra Headers by a calling program as desired.
    • +
    +
    +
    + + + + + diff --git a/sample-types.html b/sample-types.html new file mode 100644 index 0000000..bca8fa9 --- /dev/null +++ b/sample-types.html @@ -0,0 +1,94 @@ + + + + + + + +libmseed: Sample Types + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    +
    Sample Types
    +
    +
    +

    Data sample types used by the library.

    +

    Sample types are represented using a single character as follows:

      +
    • 't' - Text data samples
    • +
    • 'i' - 32-bit integer data samples
    • +
    • 'f' - 32-bit float (IEEE) data samples
    • +
    • 'd' - 64-bit float (IEEE) data samples
    • +
    +
    +
    + + + + + diff --git a/search/all_0.js b/search/all_0.js new file mode 100644 index 0000000..9ea27ca --- /dev/null +++ b/search/all_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['2_0',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['2_20x_20program_20to_20the_203_20x_20api_1',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]] +]; diff --git a/search/all_1.js b/search/all_1.js new file mode 100644 index 0000000..a7edae5 --- /dev/null +++ b/search/all_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['3_20x_20api_0',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]] +]; diff --git a/search/all_10.js b/search/all_10.js new file mode 100644 index 0000000..95ad94c --- /dev/null +++ b/search/all_10.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['questions_0',['Frequency asked questions',['../page-faq.html',1,'']]] +]; diff --git a/search/all_11.js b/search/all_11.js new file mode 100644 index 0000000..7846d89 --- /dev/null +++ b/search/all_11.js @@ -0,0 +1,37 @@ +var searchData= +[ + ['ramifications_20for_20change_20in_20data_20model_0',['Ramifications for change in data model',['../porting-guide.html#porting-data-model-change',1,'']]], + ['read_20data_20from_20a_20url_1',['How do I read data from a URL?',['../page-faq.html#faq-3',1,'']]], + ['read_20miniseed_20from_20files_2',['Read miniSEED from files',['../page-examples.html#example-mseedview',1,'']]], + ['read_20write_20data_20from_20to_20files_3',['How do I read/write data from/to files?',['../page-faq.html#faq-1',1,'']]], + ['read_20write_20data_20from_20to_20memory_20buffers_4',['Can I read/write data from/to memory buffers?',['../page-faq.html#faq-2',1,'']]], + ['readbuffer_5',['readbuffer',['../group__io-functions.html#ab8824da9e4a7a110c758cde6b02ce791',1,'MS3FileParam']]], + ['reading_20files_20in_20parallel_6',['Reading files in parallel',['../page-examples.html#example-lm_pararead',1,'']]], + ['reading_20from_20memory_20buffers_7',['Reading from memory buffers',['../page-examples.html#example-lm_read_buffer',1,'']]], + ['reading_20miniseed_20data_8',['Reading miniSEED data',['../page-tutorial.html#reading',1,'']]], + ['reading_20miniseed_20from_20files_20into_20traces_20lists_9',['Reading miniSEED from files into traces lists',['../page-tutorial.html#reading-tracelists',1,'']]], + ['reading_20miniseed_20from_20memory_10',['Reading miniSEED from memory',['../page-tutorial.html#reading-buffers',1,'']]], + ['reading_20miniseed_20records_20from_20files_11',['Reading miniSEED records from files',['../page-tutorial.html#reading-records',1,'']]], + ['reading_20with_20record_20lists_12',['Reading with record lists',['../page-examples.html#example-lm_read_recordlist',1,'']]], + ['reading_20with_20selections_13',['Reading with selections',['../page-examples.html#example-lm_read_selection',1,'']]], + ['readlength_14',['readlength',['../group__io-functions.html#a38a44d7f252e17d6ff10de03ccce43ab',1,'MS3FileParam']]], + ['readoffset_15',['readoffset',['../group__io-functions.html#ab0fce1951b780013c86c2a11b313756c',1,'MS3FileParam']]], + ['realloc_16',['realloc',['../struct_l_i_b_m_s_e_e_d___m_e_m_o_r_y.html#a41501d9828288c19d43df18d8c151a60',1,'LIBMSEED_MEMORY']]], + ['receptionquality_17',['receptionquality',['../group__extra-headers.html#af13088ba9ce6a8f3ae61cdafef1060ee',1,'MSEHTimingException']]], + ['reclen_18',['reclen',['../group__miniseed-record.html#a47d7e72d144305b788d69e3ba859f087',1,'MS3Record']]], + ['record_19',['record',['../group__miniseed-record.html#a743465a7c877b22c38d5cbeda80f0ea0',1,'MS3Record']]], + ['record_20handling_20',['Record Handling',['../group__miniseed-record.html',1,'']]], + ['record_20list_21',['Record List',['../group__record-list.html',1,'']]], + ['record_20lists_22',['Reading with record lists',['../page-examples.html#example-lm_read_recordlist',1,'']]], + ['recordcnt_23',['recordcnt',['../group__record-list.html#ae4a22fbf67865bdcb8d200abec716b5d',1,'MS3RecordList']]], + ['recordcount_24',['recordcount',['../group__io-functions.html#a6cb75fa62955a2cbc272d3e8255e9c7a',1,'MS3FileParam']]], + ['recordlist_25',['recordlist',['../group__trace-list.html#a110824afd3948973a5b015e68e90bd36',1,'MS3TraceSeg']]], + ['records_26',['Records',['../page-tutorial.html#creating-records',1,'Creating miniSEED records'],['../page-capabilities.html#data-records',1,'Data Records'],['../page-tutorial.html#writing',1,'Writing miniSEED records']]], + ['records_20from_20files_27',['Reading miniSEED records from files',['../page-tutorial.html#reading-records',1,'']]], + ['refamplitude_28',['refamplitude',['../group__extra-headers.html#ad81859b05d05ec99e7e60691f56f490a',1,'MSEHCalibration']]], + ['registry_29',['registry',['../struct_m_s_log_param.html#af1ea9698981228e4ab2355efb518e8ae',1,'MSLogParam']]], + ['representation_30',['Time representation',['../page-capabilities.html#time-representation',1,'']]], + ['return_20codes_31',['Return codes',['../group__return-values.html',1,'']]], + ['rolling_20buffer_32',['Writing miniSEED with rolling buffer',['../page-examples.html#example-lm_pack_rollingbuffer',1,'']]], + ['rolloff_33',['rolloff',['../group__extra-headers.html#a7ecc54bdd00205e0245fc6b11926dc8a',1,'MSEHCalibration']]] +]; diff --git a/search/all_12.js b/search/all_12.js new file mode 100644 index 0000000..5778674 --- /dev/null +++ b/search/all_12.js @@ -0,0 +1,32 @@ +var searchData= +[ + ['sample_20encodings_0',['Sample Encodings',['../page-capabilities.html#Data',1,'']]], + ['sample_20types_1',['Sample Types',['../sample-types.html',1,'']]], + ['samplecnt_2',['samplecnt',['../group__miniseed-record.html#a85d0d5f365d50df0490d944dffdb3853',1,'MS3Record::samplecnt'],['../group__trace-list.html#aa7c0b61595ae856dbf409db56cc74bcc',1,'MS3TraceSeg::samplecnt']]], + ['sampletype_3',['sampletype',['../group__miniseed-record.html#a866a8640500756bc031ef7897fc1eeb2',1,'MS3Record::sampletype'],['../group__trace-list.html#a9addbbe3f6cbb7f742b8def029cde74e',1,'MS3TraceSeg::sampletype']]], + ['samprate_4',['samprate',['../group__miniseed-record.html#a7578e312e666fcc80cc07fd324201d4e',1,'MS3Record::samprate'],['../group__trace-list.html#acb10e4263b0aeaab66232c35d8c7d5ac',1,'MS3TraceSeg::samprate'],['../struct_m_s3_tolerance.html#a5e1881909ccd09b01c4fa38647c1e90f',1,'MS3Tolerance::samprate']]], + ['second_20handling_5',['Leap Second Handling',['../group__leapsecond.html',1,'']]], + ['selections_6',['Selections',['../group__data-selections.html',1,'Data Selections'],['../page-examples.html#example-lm_read_selection',1,'Reading with selections']]], + ['separate_20fdsn_20identifiers_20of_20network_20station_20location_20and_20channel_7',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['series_20data_20formats_8',['Time series data formats',['../page-capabilities.html#time-series-data',1,'']]], + ['sid_9',['sid',['../group__miniseed-record.html#ac93add454993eff521bc94900bf40ac1',1,'MS3Record::sid'],['../group__trace-list.html#aaa4e9d9d9fb4c2bf4f93472500744c52',1,'MS3TraceID::sid']]], + ['sidpattern_10',['sidpattern',['../group__data-selections.html#a4a2be3073e1baabe7b79bf34e12b2799',1,'MS3Selections']]], + ['signalamplitude_11',['signalamplitude',['../group__extra-headers.html#a557b28582ee8a8adb2c78373c6eda0fd',1,'MSEHEventDetection']]], + ['signalperiod_12',['signalperiod',['../group__extra-headers.html#a2794a044867b9ff1e2e98bf9d5cfc9d4',1,'MSEHEventDetection']]], + ['simple_20why_20is_20a_20library_20needed_13',['miniSEED is simple, why is a library needed?',['../page-faq.html#faq-4',1,'']]], + ['sineperiod_14',['sineperiod',['../group__extra-headers.html#aabc2c832c967dc53d5c588f8ef25c7af',1,'MSEHCalibration']]], + ['something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_15',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['source_20identifiers_16',['Source Identifiers',['../group__string-functions.html',1,'Source Identifiers'],['../page-examples.html#example-lm_sids',1,'Working with Source Identifiers']]], + ['started_17',['Getting started',['../index.html#main-tutorial',1,'']]], + ['startoffset_18',['startoffset',['../group__io-functions.html#ac7e9ff765dad8d416abd908cfdb1b165',1,'MS3FileParam']]], + ['starttime_19',['starttime',['../group__miniseed-record.html#a8ed5d39b9df3bfa9dd953c33d27ac73e',1,'MS3Record::starttime'],['../group__data-selections.html#a78d64e7c20d9f50902102160c430a8ce',1,'MS3SelectTime::starttime'],['../group__trace-list.html#afa4b2623a8ffb336a9d9d9a9773c0dc0',1,'MS3TraceSeg::starttime']]], + ['station_20location_20and_20channel_20',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['stepbetween_21',['stepbetween',['../group__extra-headers.html#a5a6a1e9c3dff623d02f0e8f9dc5b054f',1,'MSEHCalibration']]], + ['steps_22',['steps',['../group__extra-headers.html#a9335a0bc5e3032c4afa1bc16961f300b',1,'MSEHCalibration']]], + ['still_5frunning_23',['still_running',['../struct_l_m_i_o.html#a69c636fa1034612bffab8540359120b5',1,'LMIO']]], + ['streampos_24',['streampos',['../group__io-functions.html#a4ccf0a4991547c43feb96cee3742714f',1,'MS3FileParam']]], + ['strictly_20with_20miniseed_20version_202_25',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['sucks_20what_20can_20i_20do_26',['This library sucks. What can I do?',['../page-faq.html#faq-9',1,'']]], + ['swap_20flags_27',['Byte swap flags',['../group__byte-swap-flags.html',1,'']]], + ['swapflag_28',['swapflag',['../group__miniseed-record.html#a1b9cdbece0c9b736397fe9b1de6070df',1,'MS3Record']]] +]; diff --git a/search/all_13.js b/search/all_13.js new file mode 100644 index 0000000..ed4459e --- /dev/null +++ b/search/all_13.js @@ -0,0 +1,32 @@ +var searchData= +[ + ['t_20do_20something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_0',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['taidelta_1',['TAIdelta',['../group__leapsecond.html#a474d136dee94f08f28e38e5909846ab6',1,'LeapSecond']]], + ['that_2',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['that_20commonly_20need_20attention_3',['Most important changes that commonly need attention',['../porting-guide.html#porting-important',1,'']]], + ['that_20may_20need_20attention_4',['Other changes that may need attention',['../porting-guide.html#porting-other',1,'']]], + ['the_203_20x_20api_5',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['the_20library_6',['Porting from earlier version of the library',['../index.html#porting-main',1,'']]], + ['the_20library_20and_20would_20like_20to_20cite_20it_20how_20do_20i_20do_20that_7',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['the_20library_20api_20changed_20why_20how_20do_20i_20port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_8',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['this_20library_20is_20great_20but_20doesn_20t_20do_20something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_9',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['this_20library_20sucks_20what_20can_20i_20do_10',['This library sucks. What can I do?',['../page-faq.html#faq-9',1,'']]], + ['time_11',['time',['../struct_m_s3_tolerance.html#ab9ec5ba4ab21dc5e49e9f777619eca65',1,'MS3Tolerance::time'],['../group__extra-headers.html#a71448ae63cb7b870054c45eb7d663bd2',1,'MSEHTimingException::time']]], + ['time_20definitions_20and_20functions_12',['Time definitions and functions',['../group__time-related.html',1,'']]], + ['time_20representation_13',['Time representation',['../page-capabilities.html#time-representation',1,'']]], + ['time_20series_20data_20formats_14',['Time series data formats',['../page-capabilities.html#time-series-data',1,'']]], + ['timewindows_15',['timewindows',['../group__data-selections.html#ada46cfe349531d8f8ca04860f6642cb1',1,'MS3Selections']]], + ['to_20cite_20it_20how_20do_20i_20do_20that_16',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['to_20files_17',['To files',['../page-faq.html#faq-1',1,'How do I read/write data from/to files?'],['../page-tutorial.html#writing-files',1,'Writing miniSEED data to files']]], + ['to_20memory_20buffers_18',['Can I read/write data from/to memory buffers?',['../page-faq.html#faq-2',1,'']]], + ['to_20the_203_20x_20api_19',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['to_20use_20separate_20fdsn_20identifiers_20of_20network_20station_20location_20and_20channel_20',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['trace_20list_21',['Trace List',['../group__trace-list.html',1,'']]], + ['traces_22',['traces',['../group__trace-list.html#a3b3a0fd113a19f68c9bef36c30ebd010',1,'MS3TraceList']]], + ['traces_23',['Traces',['../page-capabilities.html#traces',1,'']]], + ['traces_20lists_24',['Reading miniSEED from files into traces lists',['../page-tutorial.html#reading-tracelists',1,'']]], + ['trigger_25',['trigger',['../group__extra-headers.html#a8061945d976decae6dd0a278fa6a60ab',1,'MSEHCalibration::trigger'],['../group__extra-headers.html#a9c0b3aef1e3470d7cc1cc55baf0d295d',1,'MSEHRecenter::trigger']]], + ['tutorial_26',['Tutorial',['../page-tutorial.html',1,'index']]], + ['type_27',['type',['../struct_l_m_i_o.html#af3227dbfd8b9e6c9848e78e44e6cffa5',1,'LMIO::type'],['../group__extra-headers.html#a03d687279493da96c9e61da066dbe6da',1,'MSEHEventDetection::type'],['../group__extra-headers.html#a39a65218be03330a4da963ab77f43b33',1,'MSEHCalibration::type'],['../group__extra-headers.html#ac5a7819af9dab63c0be59d89c577efb4',1,'MSEHTimingException::type'],['../group__extra-headers.html#a6bc8934ffebb1f70a25f3310bb26b8eb',1,'MSEHRecenter::type']]], + ['types_28',['Sample Types',['../sample-types.html',1,'']]] +]; diff --git a/search/all_14.js b/search/all_14.js new file mode 100644 index 0000000..37b5288 --- /dev/null +++ b/search/all_14.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['units_0',['units',['../group__extra-headers.html#a60ccabd8ddcc074911db18f29cb2b10a',1,'MSEHEventDetection']]], + ['url_1',['How do I read data from a URL?',['../page-faq.html#faq-3',1,'']]], + ['url_20i_20o_2',['File and URL I/O',['../group__io-functions.html',1,'']]], + ['usage_3',['Common usage',['../page-tutorial.html#common-usage',1,'']]], + ['use_20libmseed_20strictly_20with_20miniseed_20version_202_4',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['use_20separate_20fdsn_20identifiers_20of_20network_20station_20location_20and_20channel_5',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['usec_6',['usec',['../group__extra-headers.html#ab747e164fd81cd1c75d45face8992918',1,'MSEHTimingException']]], + ['using_20the_20library_20and_20would_20like_20to_20cite_20it_20how_20do_20i_20do_20that_7',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['utility_20functions_8',['General Utility Functions',['../group__utility-functions.html',1,'']]] +]; diff --git a/search/all_15.js b/search/all_15.js new file mode 100644 index 0000000..f48eae8 --- /dev/null +++ b/search/all_15.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['vcocorrection_0',['vcocorrection',['../group__extra-headers.html#a34d32b844be855b58970aebd45331735',1,'MSEHTimingException']]], + ['version_202_1',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['version_20of_20the_20library_2',['Porting from earlier version of the library',['../index.html#porting-main',1,'']]], + ['versioning_3',['Versioning',['../index.html#versioning-main',1,'']]], + ['versions_4',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]] +]; diff --git a/search/all_16.js b/search/all_16.js new file mode 100644 index 0000000..b30f85d --- /dev/null +++ b/search/all_16.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['wave_0',['wave',['../group__extra-headers.html#a198493b83f4e81f77d857db7399049a5',1,'MSEHEventDetection']]], + ['what_20can_20i_20do_1',['This library sucks. What can I do?',['../page-faq.html#faq-9',1,'']]], + ['what_20can_20i_20do_20how_20can_20i_20contribute_2',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['why_20how_20do_20i_20port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_3',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['why_20is_20a_20library_20needed_4',['miniSEED is simple, why is a library needed?',['../page-faq.html#faq-4',1,'']]], + ['with_20miniseed_20version_202_5',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['with_20record_20lists_6',['Reading with record lists',['../page-examples.html#example-lm_read_recordlist',1,'']]], + ['with_20rolling_20buffer_7',['Writing miniSEED with rolling buffer',['../page-examples.html#example-lm_pack_rollingbuffer',1,'']]], + ['with_20selections_8',['Reading with selections',['../page-examples.html#example-lm_read_selection',1,'']]], + ['with_20source_20identifiers_9',['Working with Source Identifiers',['../page-examples.html#example-lm_sids',1,'']]], + ['working_20with_20source_20identifiers_10',['Working with Source Identifiers',['../page-examples.html#example-lm_sids',1,'']]], + ['would_20like_20to_20cite_20it_20how_20do_20i_20do_20that_11',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['write_20data_20from_20to_20files_12',['How do I read/write data from/to files?',['../page-faq.html#faq-1',1,'']]], + ['write_20data_20from_20to_20memory_20buffers_13',['Can I read/write data from/to memory buffers?',['../page-faq.html#faq-2',1,'']]], + ['writing_20miniseed_14',['Writing miniSEED',['../page-examples.html#example-lm_pack',1,'']]], + ['writing_20miniseed_20data_20to_20files_15',['Writing miniSEED data to files',['../page-tutorial.html#writing-files',1,'']]], + ['writing_20miniseed_20records_16',['Writing miniSEED records',['../page-tutorial.html#writing',1,'']]], + ['writing_20miniseed_20with_20rolling_20buffer_17',['Writing miniSEED with rolling buffer',['../page-examples.html#example-lm_pack_rollingbuffer',1,'']]] +]; diff --git a/search/all_17.js b/search/all_17.js new file mode 100644 index 0000000..016f17b --- /dev/null +++ b/search/all_17.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['x_20program_20to_20the_203_20x_20api_0',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]] +]; diff --git a/search/all_2.js b/search/all_2.js new file mode 100644 index 0000000..296c1c9 --- /dev/null +++ b/search/all_2.js @@ -0,0 +1,21 @@ +var searchData= +[ + ['a_20library_20needed_0',['miniSEED is simple, why is a library needed?',['../page-faq.html#faq-4',1,'']]], + ['a_20url_1',['How do I read data from a URL?',['../page-faq.html#faq-3',1,'']]], + ['acknowlegements_2',['Acknowlegements',['../index.html#main-acknowledgements',1,'']]], + ['allocators_3',['Memory Allocators',['../group__memory-allocators.html',1,'']]], + ['alternatesign_4',['alternatesign',['../group__extra-headers.html#a6aad1c6be0e64d754c606ec7b8f50ee5',1,'MSEHCalibration']]], + ['amplitude_5',['amplitude',['../group__extra-headers.html#a79a584bf831c1f23f3bc6d748d16362e',1,'MSEHCalibration']]], + ['amplituderange_6',['amplituderange',['../group__extra-headers.html#a287b848d3bc432aa4d2efeaa23ea755b',1,'MSEHCalibration']]], + ['and_20approach_7',['Overview and approach',['../porting-guide.html#porting-overview',1,'']]], + ['and_20channel_8',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['and_20functions_9',['Time definitions and functions',['../group__time-related.html',1,'']]], + ['and_20installing_10',['Downloading and installing',['../index.html#main-downloding',1,'']]], + ['and_20issues_11',['Development and issues',['../index.html#develop-main',1,'']]], + ['and_20url_20i_20o_12',['File and URL I/O',['../group__io-functions.html',1,'']]], + ['and_20would_20like_20to_20cite_20it_20how_20do_20i_20do_20that_13',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['api_20changed_20why_20how_20do_20i_20port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_14',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['approach_15',['Overview and approach',['../porting-guide.html#porting-overview',1,'']]], + ['asked_20questions_16',['Frequency asked questions',['../page-faq.html',1,'']]], + ['attention_17',['Attention',['../porting-guide.html#porting-important',1,'Most important changes that commonly need attention'],['../porting-guide.html#porting-other',1,'Other changes that may need attention']]] +]; diff --git a/search/all_3.js b/search/all_3.js new file mode 100644 index 0000000..27d220d --- /dev/null +++ b/search/all_3.js @@ -0,0 +1,11 @@ +var searchData= +[ + ['backgroundestimate_0',['backgroundestimate',['../group__extra-headers.html#a700fe60b67a6c1b452fed80a3fe00a83',1,'MSEHEventDetection']]], + ['begintime_1',['begintime',['../group__extra-headers.html#aeb3ba85fa6e82bf146521885d8928b2a',1,'MSEHCalibration::begintime'],['../group__extra-headers.html#acd488018a370ae83c57187560d1d517f',1,'MSEHRecenter::begintime']]], + ['bit_2',['bit',['../libmseed_8h.html#a3076542deab591bf8b867904cc6e416b',1,'libmseed.h']]], + ['buffer_3',['Writing miniSEED with rolling buffer',['../page-examples.html#example-lm_pack_rollingbuffer',1,'']]], + ['bufferptr_4',['bufferptr',['../group__record-list.html#aaef0f6a62aa670aee60244b934b935a2',1,'MS3RecordPtr']]], + ['buffers_5',['Buffers',['../page-faq.html#faq-2',1,'Can I read/write data from/to memory buffers?'],['../page-examples.html#example-lm_read_buffer',1,'Reading from memory buffers']]], + ['but_20doesn_20t_20do_20something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_6',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['byte_20swap_20flags_7',['Byte swap flags',['../group__byte-swap-flags.html',1,'']]] +]; diff --git a/search/all_4.js b/search/all_4.js new file mode 100644 index 0000000..0466fdb --- /dev/null +++ b/search/all_4.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['callback_20design_0',['Callback design',['../page-tutorial.html#callback',1,'']]], + ['can_20i_20do_1',['This library sucks. What can I do?',['../page-faq.html#faq-9',1,'']]], + ['can_20i_20do_20how_20can_20i_20contribute_2',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['can_20i_20read_20write_20data_20from_20to_20memory_20buffers_3',['Can I read/write data from/to memory buffers?',['../page-faq.html#faq-2',1,'']]], + ['can_20i_20use_20libmseed_20strictly_20with_20miniseed_20version_202_4',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['capabilities_5',['Capabilities',['../page-capabilities.html',1,'index']]], + ['central_20logging_6',['Central Logging',['../group__logging.html',1,'']]], + ['change_20in_20data_20model_7',['Ramifications for change in data model',['../porting-guide.html#porting-data-model-change',1,'']]], + ['changed_20why_20how_20do_20i_20port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_8',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['changes_20that_20commonly_20need_20attention_9',['Most important changes that commonly need attention',['../porting-guide.html#porting-important',1,'']]], + ['changes_20that_20may_20need_20attention_10',['Other changes that may need attention',['../porting-guide.html#porting-other',1,'']]], + ['channel_11',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['cite_20it_20how_20do_20i_20do_20that_12',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['clockstatus_13',['clockstatus',['../group__extra-headers.html#a4edb6885fbabec3e71115fbf22716da1',1,'MSEHTimingException']]], + ['codes_14',['Return codes',['../group__return-values.html',1,'']]], + ['common_20usage_15',['Common usage',['../page-tutorial.html#common-usage',1,'']]], + ['commonly_20need_20attention_16',['Most important changes that commonly need attention',['../porting-guide.html#porting-important',1,'']]], + ['continued_17',['continued',['../group__extra-headers.html#a3d2f550d6a0405a252ee51123991a8b4',1,'MSEHCalibration']]], + ['contribute_18',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['control_20flags_19',['Control flags',['../group__control-flags.html',1,'']]], + ['count_20',['count',['../group__extra-headers.html#a5ba8c8b49e869534dad58357eb2ff17f',1,'MSEHTimingException']]], + ['coupling_21',['coupling',['../group__extra-headers.html#a828729f48696977892ceac0b6e39988f',1,'MSEHCalibration']]], + ['crc_22',['crc',['../group__miniseed-record.html#a2f4036711bd3a7badb40d31f7737b770',1,'MS3Record']]], + ['creating_20miniseed_20records_23',['Creating miniSEED records',['../page-tutorial.html#creating-records',1,'']]] +]; diff --git a/search/all_5.js b/search/all_5.js new file mode 100644 index 0000000..1914733 --- /dev/null +++ b/search/all_5.js @@ -0,0 +1,49 @@ +var searchData= +[ + ['data_0',['Reading miniSEED data',['../page-tutorial.html#reading',1,'']]], + ['data_20encodings_1',['Data Encodings',['../group__encoding-values.html',1,'']]], + ['data_20formats_2',['Time series data formats',['../page-capabilities.html#time-series-data',1,'']]], + ['data_20from_20a_20url_3',['How do I read data from a URL?',['../page-faq.html#faq-3',1,'']]], + ['data_20from_20to_20files_4',['How do I read/write data from/to files?',['../page-faq.html#faq-1',1,'']]], + ['data_20from_20to_20memory_20buffers_5',['Can I read/write data from/to memory buffers?',['../page-faq.html#faq-2',1,'']]], + ['data_20model_6',['Ramifications for change in data model',['../porting-guide.html#porting-data-model-change',1,'']]], + ['data_20records_7',['Data Records',['../page-capabilities.html#data-records',1,'']]], + ['data_20selections_8',['Data Selections',['../group__data-selections.html',1,'']]], + ['data_20to_20files_9',['Writing miniSEED data to files',['../page-tutorial.html#writing-files',1,'']]], + ['datalength_10',['datalength',['../group__miniseed-record.html#a2f2c8f89d92f1758cf62a111daeb3b49',1,'MS3Record']]], + ['dataoffset_11',['dataoffset',['../group__record-list.html#aff963b092104ba09d34d3f87714fa137',1,'MS3RecordPtr']]], + ['datasamples_12',['datasamples',['../group__miniseed-record.html#a1c3a46dfc681da1bf5199b48bf9c55d3',1,'MS3Record::datasamples'],['../group__trace-list.html#a91240518702ddde33ea492251c4ad1ad',1,'MS3TraceSeg::datasamples']]], + ['datasize_13',['datasize',['../group__miniseed-record.html#a6e9073cb53e41793bd233a5e529161c0',1,'MS3Record::datasize'],['../group__trace-list.html#a5307d453e82301d7663bc019e28dc963',1,'MS3TraceSeg::datasize']]], + ['de_5fascii_14',['DE_ASCII',['../libmseed_8h.html#a0e4d3b0ef76ca9b3e19b2b9f597bc539',1,'libmseed.h']]], + ['de_5fcdsn_15',['DE_CDSN',['../group__encoding-values.html#gaf686af1ac85b949b4727abccaa3d8c36',1,'libmseed.h']]], + ['de_5fdwwssn_16',['DE_DWWSSN',['../group__encoding-values.html#gaebaa4e6c39a44eca26161bd661c98742',1,'libmseed.h']]], + ['de_5ffloat32_17',['DE_FLOAT32',['../group__encoding-values.html#ga131dc4aeb13edcbd54dc80f14315cb28',1,'libmseed.h']]], + ['de_5ffloat64_18',['DE_FLOAT64',['../group__encoding-values.html#ga25685778ab9a5295f3f15313f515820b',1,'libmseed.h']]], + ['de_5fgeoscope163_19',['DE_GEOSCOPE163',['../group__encoding-values.html#gaa9afaa7e5d17ba97e63e6976e6d67c1e',1,'libmseed.h']]], + ['de_5fgeoscope164_20',['DE_GEOSCOPE164',['../group__encoding-values.html#ga50bd840580af8b7ca11cebd257289a6a',1,'libmseed.h']]], + ['de_5fgeoscope24_21',['DE_GEOSCOPE24',['../group__encoding-values.html#ga1446b9b4114580fe4d8c366ea85db4d3',1,'libmseed.h']]], + ['de_5fint16_22',['DE_INT16',['../group__encoding-values.html#gab435f469f14c9423949f7faa644f3830',1,'libmseed.h']]], + ['de_5fint32_23',['DE_INT32',['../group__encoding-values.html#ga9ca51f3389e94e1be9834ef105bd72a8',1,'libmseed.h']]], + ['de_5fsro_24',['DE_SRO',['../group__encoding-values.html#gaa7cd0dc4bfc5c6b63f188c1630a3ad41',1,'libmseed.h']]], + ['de_5fsteim1_25',['DE_STEIM1',['../group__encoding-values.html#ga0a2d2f566d94ea965f867c52dd098388',1,'libmseed.h']]], + ['de_5fsteim2_26',['DE_STEIM2',['../group__encoding-values.html#ga88038a2002e473c74440f7fae5f0dc74',1,'libmseed.h']]], + ['de_5ftext_27',['DE_TEXT',['../group__encoding-values.html#ga6ee155d1296adcb64fe1b14cd420abe9',1,'libmseed.h']]], + ['definitions_28',['Low level definitions',['../group__low-level.html',1,'']]], + ['definitions_20and_20functions_29',['Time definitions and functions',['../group__time-related.html',1,'']]], + ['deprecated_30',['DEPRECATED',['../libmseed_8h.html#ac1e8a42306d8e67cb94ca31c3956ee78',1,'libmseed.h']]], + ['deprecated_20list_31',['Deprecated List',['../deprecated.html',1,'']]], + ['design_32',['Callback design',['../page-tutorial.html#callback',1,'']]], + ['detector_33',['detector',['../group__extra-headers.html#ad974b55878e655a2eed80105b19f1bc0',1,'MSEHEventDetection']]], + ['development_20and_20issues_34',['Development and issues',['../index.html#develop-main',1,'']]], + ['diag_5fprint_35',['diag_print',['../struct_m_s_log_param.html#a450edd551b10b7c6c90ce5e431ace2b8',1,'MSLogParam']]], + ['do_36',['This library sucks. What can I do?',['../page-faq.html#faq-9',1,'']]], + ['do_20i_20do_20that_37',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['do_20i_20port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_38',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['do_20i_20read_20data_20from_20a_20url_39',['How do I read data from a URL?',['../page-faq.html#faq-3',1,'']]], + ['do_20i_20read_20write_20data_20from_20to_20files_40',['How do I read/write data from/to files?',['../page-faq.html#faq-1',1,'']]], + ['do_20something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_41',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['documentation_42',['libmseed Documentation',['../index.html',1,'']]], + ['doesn_20t_20do_20something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_43',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['downloading_20and_20installing_44',['Downloading and installing',['../index.html#main-downloding',1,'']]], + ['duration_45',['duration',['../group__extra-headers.html#a18fef7d0ab5cc3c14a287327cbdcdf9f',1,'MSEHCalibration']]] +]; diff --git a/search/all_6.js b/search/all_6.js new file mode 100644 index 0000000..15437b7 --- /dev/null +++ b/search/all_6.js @@ -0,0 +1,15 @@ +var searchData= +[ + ['earlier_20libmseed_20versions_0',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]], + ['earlier_20version_20of_20the_20library_1',['Porting from earlier version of the library',['../index.html#porting-main',1,'']]], + ['earliest_2',['earliest',['../group__trace-list.html#a537e76409176bd8fca77a71e73b825fb',1,'MS3TraceID']]], + ['encoding_3',['encoding',['../group__miniseed-record.html#a8e24740495d2a30f8282cc17b2a6e024',1,'MS3Record']]], + ['encodings_4',['Encodings',['../group__encoding-values.html',1,'Data Encodings'],['../page-capabilities.html#Data',1,'Sample Encodings']]], + ['endoffset_5',['endoffset',['../group__io-functions.html#a62997dc15d8767b74fa3e4631f205005',1,'MS3FileParam']]], + ['endtime_6',['endtime',['../group__data-selections.html#a2ee8c2e69ec6545b3186a280e81d0113',1,'MS3SelectTime::endtime'],['../group__record-list.html#af074b4922203d707d08e468c10dd0aab',1,'MS3RecordPtr::endtime'],['../group__trace-list.html#a2c33217da025db4c975c4013629d53eb',1,'MS3TraceSeg::endtime'],['../group__extra-headers.html#a370138b89fa51cc8995cd050a384aa43',1,'MSEHCalibration::endtime'],['../group__extra-headers.html#ad97e1acdc21bd0bc6306128fd85a6f74',1,'MSEHRecenter::endtime']]], + ['errprefix_7',['errprefix',['../struct_m_s_log_param.html#acedb283364c1f5fcf241fbe74e9ff220',1,'MSLogParam']]], + ['examples_8',['Examples',['../page-examples.html',1,'']]], + ['extra_9',['extra',['../group__miniseed-record.html#afcafda3b77442403616ecb1d6abdf5ee',1,'MS3Record']]], + ['extra_20headers_10',['Extra Headers',['../group__extra-headers.html',1,'']]], + ['extralength_11',['extralength',['../group__miniseed-record.html#a65957a9427ffd7f93a811813b8d497ff',1,'MS3Record']]] +]; diff --git a/search/all_7.js b/search/all_7.js new file mode 100644 index 0000000..01baf40 --- /dev/null +++ b/search/all_7.js @@ -0,0 +1,34 @@ +var searchData= +[ + ['faqs_0',['FAQs',['../page-faq.html#faq-list',1,'']]], + ['fdsn_20identifiers_20of_20network_20station_20location_20and_20channel_1',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['file_20and_20url_20i_20o_2',['File and URL I/O',['../group__io-functions.html',1,'']]], + ['filename_3',['filename',['../group__record-list.html#a56cdc9b5211dc6b1a2340093d3272db7',1,'MS3RecordPtr']]], + ['fileoffset_4',['fileoffset',['../group__record-list.html#a56ab5d737fce6c90c5404bc0d7cfdcc3',1,'MS3RecordPtr']]], + ['fileptr_5',['fileptr',['../group__record-list.html#ab111fd7ecab5397692070960158328b6',1,'MS3RecordPtr']]], + ['files_6',['Files',['../page-faq.html#faq-1',1,'How do I read/write data from/to files?'],['../page-examples.html#example-mseedview',1,'Read miniSEED from files'],['../page-tutorial.html#reading-records',1,'Reading miniSEED records from files'],['../page-tutorial.html#writing-files',1,'Writing miniSEED data to files']]], + ['files_20in_20parallel_7',['Reading files in parallel',['../page-examples.html#example-lm_pararead',1,'']]], + ['files_20into_20traces_20lists_8',['Reading miniSEED from files into traces lists',['../page-tutorial.html#reading-tracelists',1,'']]], + ['first_9',['first',['../group__record-list.html#a6bd5bfade2159b8bb2a1d201323f8d2b',1,'MS3RecordList::first'],['../group__trace-list.html#a2c57e9aa2e2b922b57df9ea8031aebde',1,'MS3TraceID::first']]], + ['firstpulsepositive_10',['firstpulsepositive',['../group__extra-headers.html#a2d68f17cb14eee351a24978d51c7faae',1,'MSEHCalibration']]], + ['flag_11',['flag',['../libmseed_8h.html#a2fa2d4ca679cdb79cfa01c1cc94a7298',1,'libmseed.h']]], + ['flags_12',['flags',['../group__byte-swap-flags.html',1,'Byte swap flags'],['../group__control-flags.html',1,'Control flags'],['../group__miniseed-record.html#a62262ba1ebfcb148c4559079deab0225',1,'MS3Record::flags'],['../group__io-functions.html#a85eef14a2a5b3e566670dbcb85a91df1',1,'MS3FileParam::flags']]], + ['for_20change_20in_20data_20model_13',['Ramifications for change in data model',['../porting-guide.html#porting-data-model-change',1,'']]], + ['for_20porting_20from_20earlier_20libmseed_20versions_14',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]], + ['formats_15',['Time series data formats',['../page-capabilities.html#time-series-data',1,'']]], + ['formatversion_16',['formatversion',['../group__miniseed-record.html#a418616cb8cea93ef6e70a88b72f11ab0',1,'MS3Record']]], + ['free_17',['free',['../struct_l_i_b_m_s_e_e_d___m_e_m_o_r_y.html#a71e9c2616849eeefdc9995dfc1ecfc60',1,'LIBMSEED_MEMORY']]], + ['frequency_20asked_20questions_18',['Frequency asked questions',['../page-faq.html',1,'']]], + ['from_20a_20url_19',['How do I read data from a URL?',['../page-faq.html#faq-3',1,'']]], + ['from_20earlier_20libmseed_20versions_20',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]], + ['from_20earlier_20version_20of_20the_20library_21',['Porting from earlier version of the library',['../index.html#porting-main',1,'']]], + ['from_20files_22',['From files',['../page-examples.html#example-mseedview',1,'Read miniSEED from files'],['../page-tutorial.html#reading-records',1,'Reading miniSEED records from files']]], + ['from_20files_20into_20traces_20lists_23',['Reading miniSEED from files into traces lists',['../page-tutorial.html#reading-tracelists',1,'']]], + ['from_20memory_24',['Reading miniSEED from memory',['../page-tutorial.html#reading-buffers',1,'']]], + ['from_20memory_20buffers_25',['Reading from memory buffers',['../page-examples.html#example-lm_read_buffer',1,'']]], + ['from_20to_20files_26',['How do I read/write data from/to files?',['../page-faq.html#faq-1',1,'']]], + ['from_20to_20memory_20buffers_27',['Can I read/write data from/to memory buffers?',['../page-faq.html#faq-2',1,'']]], + ['function_28',['function',['../group__logging.html#a6642e4cb69514b7cd9ae2d49bd3bd788',1,'MSLogEntry']]], + ['functions_29',['General Utility Functions',['../group__utility-functions.html',1,'']]], + ['functions_30',['Time definitions and functions',['../group__time-related.html',1,'']]] +]; diff --git a/search/all_8.js b/search/all_8.js new file mode 100644 index 0000000..7704560 --- /dev/null +++ b/search/all_8.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['general_20utility_20functions_0',['General Utility Functions',['../group__utility-functions.html',1,'']]], + ['getting_20started_1',['Getting started',['../index.html#main-tutorial',1,'']]], + ['great_20but_20doesn_20t_20do_20something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_2',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['guide_20for_20porting_20from_20earlier_20libmseed_20versions_3',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]] +]; diff --git a/search/all_9.js b/search/all_9.js new file mode 100644 index 0000000..726c05a --- /dev/null +++ b/search/all_9.js @@ -0,0 +1,13 @@ +var searchData= +[ + ['handle_0',['handle',['../struct_l_m_i_o.html#a0f1fde1ee5e938c31fae394104b90066',1,'LMIO']]], + ['handle2_1',['handle2',['../struct_l_m_i_o.html#a1749bd64677cefdc18fe151b52a0ca73',1,'LMIO']]], + ['handling_2',['Handling',['../group__leapsecond.html',1,'Leap Second Handling'],['../group__miniseed-record.html',1,'Record Handling']]], + ['headers_3',['Extra Headers',['../group__extra-headers.html',1,'']]], + ['height_4',['height',['../group__trace-list.html#a4fa438f1160b2c5318714545a3004dbe',1,'MS3TraceID']]], + ['how_20can_20i_20contribute_5',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['how_20do_20i_20do_20that_6',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['how_20do_20i_20port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_7',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['how_20do_20i_20read_20data_20from_20a_20url_8',['How do I read data from a URL?',['../page-faq.html#faq-3',1,'']]], + ['how_20do_20i_20read_20write_20data_20from_20to_20files_9',['How do I read/write data from/to files?',['../page-faq.html#faq-1',1,'']]] +]; diff --git a/search/all_a.js b/search/all_a.js new file mode 100644 index 0000000..f5b81a7 --- /dev/null +++ b/search/all_a.js @@ -0,0 +1,27 @@ +var searchData= +[ + ['i_20do_0',['This library sucks. What can I do?',['../page-faq.html#faq-9',1,'']]], + ['i_20m_20using_20the_20library_20and_20would_20like_20to_20cite_20it_20how_20do_20i_20do_20that_1',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['i_20need_20to_20use_20separate_20fdsn_20identifiers_20of_20network_20station_20location_20and_20channel_2',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_3',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['i_20o_4',['File and URL I/O',['../group__io-functions.html',1,'']]], + ['i_20port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_5',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['i_20read_20data_20from_20a_20url_6',['How do I read data from a URL?',['../page-faq.html#faq-3',1,'']]], + ['i_20read_20write_20data_20from_20to_20files_7',['How do I read/write data from/to files?',['../page-faq.html#faq-1',1,'']]], + ['i_20read_20write_20data_20from_20to_20memory_20buffers_8',['Can I read/write data from/to memory buffers?',['../page-faq.html#faq-2',1,'']]], + ['i_20use_20libmseed_20strictly_20with_20miniseed_20version_202_9',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['identifiers_10',['Identifiers',['../group__string-functions.html',1,'Source Identifiers'],['../page-examples.html#example-lm_sids',1,'Working with Source Identifiers']]], + ['identifiers_20of_20network_20station_20location_20and_20channel_11',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['important_20changes_20that_20commonly_20need_20attention_12',['Most important changes that commonly need attention',['../porting-guide.html#porting-important',1,'']]], + ['in_20data_20model_13',['Ramifications for change in data model',['../porting-guide.html#porting-data-model-change',1,'']]], + ['in_20parallel_14',['Reading files in parallel',['../page-examples.html#example-lm_pararead',1,'']]], + ['input_15',['input',['../group__io-functions.html#a6e1e020cfbb1407cdcdccde713bd4b84',1,'MS3FileParam']]], + ['inputchannel_16',['inputchannel',['../group__extra-headers.html#a1b71af7e6b36aefd63fd3a3c5c408cca',1,'MSEHCalibration']]], + ['inputunits_17',['inputunits',['../group__extra-headers.html#aaacb7fe7f366cbda2a72f5a7c4437693',1,'MSEHCalibration']]], + ['installing_18',['Downloading and installing',['../index.html#main-downloding',1,'']]], + ['into_20traces_20lists_19',['Reading miniSEED from files into traces lists',['../page-tutorial.html#reading-tracelists',1,'']]], + ['is_20great_20but_20doesn_20t_20do_20something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_20',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['is_20simple_20why_20is_20a_20library_20needed_21',['miniSEED is simple, why is a library needed?',['../page-faq.html#faq-4',1,'']]], + ['issues_22',['Development and issues',['../index.html#develop-main',1,'']]], + ['it_20how_20do_20i_20do_20that_23',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]] +]; diff --git a/search/all_b.js b/search/all_b.js new file mode 100644 index 0000000..b7c7624 --- /dev/null +++ b/search/all_b.js @@ -0,0 +1,50 @@ +var searchData= +[ + ['last_0',['last',['../group__record-list.html#a349f117f2e151adbf1f1c2de1c12f801',1,'MS3RecordList::last'],['../group__trace-list.html#ab51385237a38668bbe47adb79379ab97',1,'MS3TraceID::last']]], + ['latest_1',['latest',['../group__trace-list.html#a3464b9217cd83f1c8a1527ac2384ff63',1,'MS3TraceID']]], + ['leap_20second_20handling_2',['Leap Second Handling',['../group__leapsecond.html',1,'']]], + ['leapsecond_3',['LeapSecond',['../group__leapsecond.html#struct_leap_second',1,'']]], + ['leapsecond_4',['leapsecond',['../group__leapsecond.html#a93fbce1d37bc62347a66ed94641c4c05',1,'LeapSecond']]], + ['leapsecondlist_5',['leapsecondlist',['../group__leapsecond.html#ga1309a5ecf5ce40f29d36a6893ff12955',1,'libmseed.h']]], + ['level_6',['level',['../group__logging.html#abac35e50e83ae037734fc0542ceaabe8',1,'MSLogEntry']]], + ['level_20definitions_7',['Low level definitions',['../group__low-level.html',1,'']]], + ['libmseed_202_20x_20program_20to_20the_203_20x_20api_8',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['libmseed_20documentation_9',['libmseed Documentation',['../index.html',1,'']]], + ['libmseed_20strictly_20with_20miniseed_20version_202_10',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['libmseed_20versions_11',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]], + ['libmseed_2eh_12',['libmseed.h',['../libmseed_8h.html',1,'']]], + ['libmseed_5fmemory_13',['LIBMSEED_MEMORY',['../struct_l_i_b_m_s_e_e_d___m_e_m_o_r_y.html',1,'']]], + ['libmseed_5fmemory_14',['libmseed_memory',['../group__memory-allocators.html#ga3f3602aa6e0b0ae43a263682939a26af',1,'libmseed.h']]], + ['libmseed_5fmemory_5fprealloc_15',['libmseed_memory_prealloc',['../group__memory-allocators.html#ga8f4c33db1225981c896f62329ad16f3b',1,'libmseed.h']]], + ['libmseed_5fprealloc_5fblock_5fsize_16',['libmseed_prealloc_block_size',['../group__memory-allocators.html#gac6849eb93f00f89d4dc01f8a3692df3b',1,'libmseed.h']]], + ['libmseed_5frelease_17',['LIBMSEED_RELEASE',['../libmseed_8h.html#ada98297f78bcc0e44b305e2686587c31',1,'libmseed.h']]], + ['libmseed_5furl_5fsupport_18',['libmseed_url_support',['../group__io-functions.html#gaae2aee8ed2ea3bce6aa164e6c653c5c7',1,'libmseed_url_support(void): fileutils.c'],['../group__io-functions.html#gaae2aee8ed2ea3bce6aa164e6c653c5c7',1,'libmseed_url_support(void): fileutils.c']]], + ['libmseed_5fversion_19',['LIBMSEED_VERSION',['../libmseed_8h.html#a20c5bfa50e3cd86ca63aba405111fc50',1,'libmseed.h']]], + ['library_20',['Porting from earlier version of the library',['../index.html#porting-main',1,'']]], + ['library_20and_20would_20like_20to_20cite_20it_20how_20do_20i_20do_20that_21',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['library_20api_20changed_20why_20how_20do_20i_20port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_22',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['library_20is_20great_20but_20doesn_20t_20do_20something_20i_20need_20what_20can_20i_20do_20how_20can_20i_20contribute_23',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['library_20needed_24',['miniSEED is simple, why is a library needed?',['../page-faq.html#faq-4',1,'']]], + ['library_20sucks_20what_20can_20i_20do_25',['This library sucks. What can I do?',['../page-faq.html#faq-9',1,'']]], + ['license_26',['License',['../index.html#main-license',1,'']]], + ['like_20to_20cite_20it_20how_20do_20i_20do_20that_27',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['list_28',['List',['../deprecated.html',1,'Deprecated List'],['../group__record-list.html',1,'Record List'],['../group__trace-list.html',1,'Trace List']]], + ['lists_29',['Lists',['../page-tutorial.html#reading-tracelists',1,'Reading miniSEED from files into traces lists'],['../page-examples.html#example-lm_read_recordlist',1,'Reading with record lists']]], + ['lm_5fparsed_5fjson_30',['LM_PARSED_JSON',['../group__extra-headers.html#gaa1c6a244f9a38e2752ebc57a0c1bcdc8',1,'libmseed.h']]], + ['lm_5fsidlen_31',['LM_SIDLEN',['../libmseed_8h.html#a35732636583abd22ed0307c5d2576493',1,'libmseed.h']]], + ['lmio_32',['LMIO',['../struct_l_m_i_o.html',1,'']]], + ['lmio_5ffd_33',['LMIO_FD',['../struct_l_m_i_o.html#aefbfc81ee19aa0079ae479cdabcb0b10a4aa4eae188827b75ab0d852939617ba0',1,'LMIO']]], + ['lmio_5ffile_34',['LMIO_FILE',['../struct_l_m_i_o.html#aefbfc81ee19aa0079ae479cdabcb0b10aef1c9b46c67bf1c58f36c138d6ce033b',1,'LMIO']]], + ['lmio_5finitializer_35',['LMIO_INITIALIZER',['../group__io-functions.html#ga53e592a1a8ad8619eee24984c6244bac',1,'libmseed.h']]], + ['lmio_5fnull_36',['LMIO_NULL',['../struct_l_m_i_o.html#aefbfc81ee19aa0079ae479cdabcb0b10abf5a0271489387d7b969f1291d3b631b',1,'LMIO']]], + ['lmio_5furl_37',['LMIO_URL',['../struct_l_m_i_o.html#aefbfc81ee19aa0079ae479cdabcb0b10a4d21b71edf1f7b316cdc5a92290c90f2',1,'LMIO']]], + ['lmp_5ffseek64_38',['lmp_fseek64',['../group__utility-functions.html#ga92c4ecd16a9937d4f522e490f79635a1',1,'libmseed.h']]], + ['lmp_5fftell64_39',['lmp_ftell64',['../group__utility-functions.html#gaa742c658d2e2a7d9395b0306c3b86645',1,'libmseed.h']]], + ['lmp_5fnanosleep_40',['lmp_nanosleep',['../group__utility-functions.html#ga681383c813edfa05512c2e4cc4bad263',1,'libmseed.h']]], + ['location_20and_20channel_41',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['log_20messages_42',['Log messages',['../page-capabilities.html#log-messages',1,'']]], + ['log_5fprint_43',['log_print',['../struct_m_s_log_param.html#a6e7405b9ff619fc0d856e87fc872361d',1,'MSLogParam']]], + ['logging_44',['Central Logging',['../group__logging.html',1,'']]], + ['logprefix_45',['logprefix',['../struct_m_s_log_param.html#acd87b29d3019372336c107a9b19b4d37',1,'MSLogParam']]], + ['low_20level_20definitions_46',['Low level definitions',['../group__low-level.html',1,'']]] +]; diff --git a/search/all_c.js b/search/all_c.js new file mode 100644 index 0000000..00c2dfa --- /dev/null +++ b/search/all_c.js @@ -0,0 +1,198 @@ +var searchData= +[ + ['m_20using_20the_20library_20and_20would_20like_20to_20cite_20it_20how_20do_20i_20do_20that_0',['I'm using the library and would like to cite it. How do I do that?',['../page-faq.html#faq-8',1,'']]], + ['malloc_1',['malloc',['../struct_l_i_b_m_s_e_e_d___m_e_m_o_r_y.html#ade342670ae3b1f47edcfec0918158a12',1,'LIBMSEED_MEMORY']]], + ['max_5flog_5fmsg_5flength_2',['MAX_LOG_MSG_LENGTH',['../group__logging.html#ga190da5427c505a70d7f9fab4b521bdd7',1,'libmseed.h']]], + ['maxreclen_3',['MAXRECLEN',['../libmseed_8h.html#ace2e140b5467fa3bc3bde66bb27ad30c',1,'libmseed.h']]], + ['maxreclenv2_4',['MAXRECLENv2',['../libmseed_8h.html#a9cce04d2a8e17d6b767fe43e44fecf08',1,'libmseed.h']]], + ['may_20need_20attention_5',['Other changes that may need attention',['../porting-guide.html#porting-other',1,'']]], + ['medlookback_6',['medlookback',['../group__extra-headers.html#a30082b2b03c239fd79b36e08cc2d1d7f',1,'MSEHEventDetection']]], + ['medpickalgorithm_7',['medpickalgorithm',['../group__extra-headers.html#abae76dd35ec4bbcf19e13d6aa0d0bb21',1,'MSEHEventDetection']]], + ['medsnr_8',['medsnr',['../group__extra-headers.html#ab85ef558bd76ddb078f5ee3845779371',1,'MSEHEventDetection']]], + ['memory_9',['Reading miniSEED from memory',['../page-tutorial.html#reading-buffers',1,'']]], + ['memory_20allocators_10',['Memory Allocators',['../group__memory-allocators.html',1,'']]], + ['memory_20buffers_11',['Memory buffers',['../page-faq.html#faq-2',1,'Can I read/write data from/to memory buffers?'],['../page-examples.html#example-lm_read_buffer',1,'Reading from memory buffers']]], + ['message_12',['message',['../group__logging.html#a6076d822e6d029d778c6d79f40ec9517',1,'MSLogEntry']]], + ['messages_13',['Log messages',['../page-capabilities.html#log-messages',1,'']]], + ['miniseed_14',['Writing miniSEED',['../page-examples.html#example-lm_pack',1,'']]], + ['miniseed_20data_15',['Reading miniSEED data',['../page-tutorial.html#reading',1,'']]], + ['miniseed_20data_20to_20files_16',['Writing miniSEED data to files',['../page-tutorial.html#writing-files',1,'']]], + ['miniseed_20from_20files_17',['Read miniSEED from files',['../page-examples.html#example-mseedview',1,'']]], + ['miniseed_20from_20files_20into_20traces_20lists_18',['Reading miniSEED from files into traces lists',['../page-tutorial.html#reading-tracelists',1,'']]], + ['miniseed_20from_20memory_19',['Reading miniSEED from memory',['../page-tutorial.html#reading-buffers',1,'']]], + ['miniseed_20is_20simple_20why_20is_20a_20library_20needed_20',['miniSEED is simple, why is a library needed?',['../page-faq.html#faq-4',1,'']]], + ['miniseed_20records_21',['MiniSEED records',['../page-tutorial.html#creating-records',1,'Creating miniSEED records'],['../page-tutorial.html#writing',1,'Writing miniSEED records']]], + ['miniseed_20records_20from_20files_22',['Reading miniSEED records from files',['../page-tutorial.html#reading-records',1,'']]], + ['miniseed_20version_202_23',['Can I use libmseed strictly with miniSEED version 2?',['../page-faq.html#faq-5',1,'']]], + ['miniseed_20with_20rolling_20buffer_24',['Writing miniSEED with rolling buffer',['../page-examples.html#example-lm_pack_rollingbuffer',1,'']]], + ['minreclen_25',['MINRECLEN',['../libmseed_8h.html#a22b93f8754191985699fc159c81c12af',1,'libmseed.h']]], + ['model_26',['Ramifications for change in data model',['../porting-guide.html#porting-data-model-change',1,'']]], + ['most_20important_20changes_20that_20commonly_20need_20attention_27',['Most important changes that commonly need attention',['../porting-guide.html#porting-important',1,'']]], + ['ms2_5fisdataindicator_28',['MS2_ISDATAINDICATOR',['../libmseed_8h.html#a2406be03c7519a2248f46021a9dd28a4',1,'libmseed.h']]], + ['ms2_5fisvalidheader_29',['MS2_ISVALIDHEADER',['../libmseed_8h.html#aadb6dda3b0b229eb07ec8e4aa0b6deff',1,'libmseed.h']]], + ['ms3_5faddselect_30',['ms3_addselect',['../group__data-selections.html#ga01488fc141d7bb72a384bbb7ff7967a1',1,'ms3_addselect(MS3Selections **ppselections, const char *sidpattern, nstime_t starttime, nstime_t endtime, uint8_t pubversion): selection.c'],['../group__data-selections.html#ga01488fc141d7bb72a384bbb7ff7967a1',1,'ms3_addselect(MS3Selections **ppselections, const char *sidpattern, nstime_t starttime, nstime_t endtime, uint8_t pubversion): selection.c']]], + ['ms3_5faddselect_5fcomp_31',['ms3_addselect_comp',['../group__data-selections.html#gad4c0405d54cca1c60eed151e38a84cb7',1,'ms3_addselect_comp(MS3Selections **ppselections, char *network, char *station, char *location, char *channel, nstime_t starttime, nstime_t endtime, uint8_t pubversion): selection.c'],['../group__data-selections.html#gad4c0405d54cca1c60eed151e38a84cb7',1,'ms3_addselect_comp(MS3Selections **ppselections, char *network, char *station, char *location, char *channel, nstime_t starttime, nstime_t endtime, uint8_t pubversion): selection.c']]], + ['ms3_5fdetect_32',['ms3_detect',['../group__miniseed-record.html#ga1a531100f0355126420e7d163fb9f2d4',1,'ms3_detect(const char *record, uint64_t recbuflen, uint8_t *formatversion): parseutils.c'],['../group__miniseed-record.html#ga1a531100f0355126420e7d163fb9f2d4',1,'ms3_detect(const char *record, uint64_t recbuflen, uint8_t *formatversion): parseutils.c']]], + ['ms3_5ffreeselections_33',['ms3_freeselections',['../group__data-selections.html#ga63f765d5d879a6e9c065e56c47a9d053',1,'ms3_freeselections(MS3Selections *selections): selection.c'],['../group__data-selections.html#ga63f765d5d879a6e9c065e56c47a9d053',1,'ms3_freeselections(MS3Selections *selections): selection.c']]], + ['ms3_5fisvalidheader_34',['MS3_ISVALIDHEADER',['../libmseed_8h.html#a8c65f1afa8e4653870ecf54b4ba0a4f0',1,'libmseed.h']]], + ['ms3_5fmatchselect_35',['ms3_matchselect',['../group__data-selections.html#gad1d54978fe865036332699767be34957',1,'ms3_matchselect(const MS3Selections *selections, const char *sid, nstime_t starttime, nstime_t endtime, int pubversion, const MS3SelectTime **ppselecttime): selection.c'],['../group__data-selections.html#gad1d54978fe865036332699767be34957',1,'ms3_matchselect(const MS3Selections *selections, const char *sid, nstime_t starttime, nstime_t endtime, int pubversion, const MS3SelectTime **ppselecttime): selection.c']]], + ['ms3_5fmstl_5finit_5ffd_36',['ms3_mstl_init_fd',['../group__io-functions.html#gae9b315964d905bd43833c93072bcc309',1,'ms3_mstl_init_fd(int fd): fileutils.c'],['../group__io-functions.html#gae9b315964d905bd43833c93072bcc309',1,'ms3_mstl_init_fd(int fd): fileutils.c']]], + ['ms3_5fprintselections_37',['ms3_printselections',['../group__data-selections.html#ga547f4d445c12e091bccca07de4135ccd',1,'ms3_printselections(const MS3Selections *selections): selection.c'],['../group__data-selections.html#ga547f4d445c12e091bccca07de4135ccd',1,'ms3_printselections(const MS3Selections *selections): selection.c']]], + ['ms3_5freadmsr_38',['ms3_readmsr',['../group__io-functions.html#gabb15ee422d81c42ed32bdeda94dfd87f',1,'ms3_readmsr(MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#gabb15ee422d81c42ed32bdeda94dfd87f',1,'ms3_readmsr(MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5freadmsr_5fr_39',['ms3_readmsr_r',['../group__io-functions.html#ga5b6440ce977797480d92b89d9c27b65e',1,'ms3_readmsr_r(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#ga5b6440ce977797480d92b89d9c27b65e',1,'ms3_readmsr_r(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5freadmsr_5fselection_40',['ms3_readmsr_selection',['../group__io-functions.html#gad8cfc654942a576ec6ec2e28d15ba9c8',1,'ms3_readmsr_selection(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, const MS3Selections *selections, int8_t verbose): fileutils.c'],['../group__io-functions.html#gad8cfc654942a576ec6ec2e28d15ba9c8',1,'ms3_readmsr_selection(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, const MS3Selections *selections, int8_t verbose): fileutils.c']]], + ['ms3_5freadselectionsfile_41',['ms3_readselectionsfile',['../group__data-selections.html#ga273a78998a8d5e515e54ac6e6f13c814',1,'ms3_readselectionsfile(MS3Selections **ppselections, const char *filename): selection.c'],['../group__data-selections.html#ga273a78998a8d5e515e54ac6e6f13c814',1,'ms3_readselectionsfile(MS3Selections **ppselections, const char *filename): selection.c']]], + ['ms3_5freadtracelist_42',['ms3_readtracelist',['../group__io-functions.html#ga1157d4e72e44fc250e36df8f073a9b68',1,'ms3_readtracelist(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#ga1157d4e72e44fc250e36df8f073a9b68',1,'ms3_readtracelist(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5freadtracelist_5fselection_43',['ms3_readtracelist_selection',['../group__io-functions.html#ga12803e139bd2dce6c1a7d03cbde8c384',1,'ms3_readtracelist_selection(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#ga12803e139bd2dce6c1a7d03cbde8c384',1,'ms3_readtracelist_selection(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5freadtracelist_5ftimewin_44',['ms3_readtracelist_timewin',['../group__io-functions.html#gabf2392422d3c3cee5bdf07d5ac1f953d',1,'ms3_readtracelist_timewin(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, nstime_t starttime, nstime_t endtime, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#gabf2392422d3c3cee5bdf07d5ac1f953d',1,'ms3_readtracelist_timewin(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, nstime_t starttime, nstime_t endtime, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5furl_5faddheader_45',['ms3_url_addheader',['../group__io-functions.html#ga7c518130509dfa8ccc5eada90d73d440',1,'ms3_url_addheader(const char *header): fileutils.c'],['../group__io-functions.html#ga7c518130509dfa8ccc5eada90d73d440',1,'ms3_url_addheader(const char *header): fileutils.c']]], + ['ms3_5furl_5ffreeheaders_46',['ms3_url_freeheaders',['../group__io-functions.html#ga2f0f529388948a9ff6445ad03dd91efd',1,'ms3_url_freeheaders(void): fileutils.c'],['../group__io-functions.html#ga2f0f529388948a9ff6445ad03dd91efd',1,'ms3_url_freeheaders(void): fileutils.c']]], + ['ms3_5furl_5fuseragent_47',['ms3_url_useragent',['../group__io-functions.html#gafcc98efb81d4f4adb24c9b07bd094e61',1,'ms3_url_useragent(const char *program, const char *version): fileutils.c'],['../group__io-functions.html#gafcc98efb81d4f4adb24c9b07bd094e61',1,'ms3_url_useragent(const char *program, const char *version): fileutils.c']]], + ['ms3_5furl_5fuserpassword_48',['ms3_url_userpassword',['../group__io-functions.html#gae4dcc9f830ddb1a8cdfd69c06b6cbe21',1,'ms3_url_userpassword(const char *userpassword): fileutils.c'],['../group__io-functions.html#gae4dcc9f830ddb1a8cdfd69c06b6cbe21',1,'ms3_url_userpassword(const char *userpassword): fileutils.c']]], + ['ms3fileparam_49',['MS3FileParam',['../group__io-functions.html#struct_m_s3_file_param',1,'']]], + ['ms3fileparam_5finitializer_50',['MS3FileParam_INITIALIZER',['../group__io-functions.html#gac834ab55cefd6381aaf527bb1b0d4f60',1,'libmseed.h']]], + ['ms3record_51',['MS3Record',['../group__miniseed-record.html#struct_m_s3_record',1,'']]], + ['ms3recordlist_52',['MS3RecordList',['../group__record-list.html#struct_m_s3_record_list',1,'']]], + ['ms3recordptr_53',['MS3RecordPtr',['../group__record-list.html#struct_m_s3_record_ptr',1,'']]], + ['ms3selections_54',['MS3Selections',['../group__data-selections.html#struct_m_s3_selections',1,'']]], + ['ms3selecttime_55',['MS3SelectTime',['../group__data-selections.html#struct_m_s3_select_time',1,'']]], + ['ms3tolerance_56',['MS3Tolerance',['../struct_m_s3_tolerance.html',1,'']]], + ['ms3tolerance_5finitializer_57',['MS3Tolerance_INITIALIZER',['../group__trace-list.html#gac12c3567faca205584ab96f63a350ec7',1,'libmseed.h']]], + ['ms3traceid_58',['MS3TraceID',['../group__trace-list.html#struct_m_s3_trace_i_d',1,'']]], + ['ms3tracelist_59',['MS3TraceList',['../group__trace-list.html#struct_m_s3_trace_list',1,'']]], + ['ms3traceseg_60',['MS3TraceSeg',['../group__trace-list.html#struct_m_s3_trace_seg',1,'']]], + ['ms_5fbigendianhost_61',['ms_bigendianhost',['../group__utility-functions.html#ga64d6ddf48ae61fbb60ad1bd7392b90a0',1,'ms_bigendianhost(void): genutils.c'],['../group__utility-functions.html#ga64d6ddf48ae61fbb60ad1bd7392b90a0',1,'ms_bigendianhost(void): genutils.c']]], + ['ms_5fcrc32c_62',['ms_crc32c',['../group__utility-functions.html#ga21eb15aac0bb55fc5a3e0f45ceba4d60',1,'libmseed.h']]], + ['ms_5fdabs_63',['ms_dabs',['../group__utility-functions.html#gafb9328b80cda4b72ef76fdc77e1807f2',1,'ms_dabs(double val): genutils.c'],['../group__utility-functions.html#gafb9328b80cda4b72ef76fdc77e1807f2',1,'ms_dabs(double val): genutils.c']]], + ['ms_5fdecode_5fdata_64',['ms_decode_data',['../group__miniseed-record.html#ga9b407f96d2998e4e6376947bb5025598',1,'ms_decode_data(const void *input, uint64_t inputsize, uint8_t encoding, uint64_t samplecount, void *output, uint64_t outputsize, char *sampletype, int8_t swapflag, const char *sid, int8_t verbose): unpack.c'],['../group__miniseed-record.html#ga9b407f96d2998e4e6376947bb5025598',1,'ms_decode_data(const void *input, uint64_t inputsize, uint8_t encoding, uint64_t samplecount, void *output, uint64_t outputsize, char *sampletype, int8_t swapflag, const char *sid, int8_t verbose): unpack.c']]], + ['ms_5fdoy2md_65',['ms_doy2md',['../group__time-related.html#gad742a6973b9b9b28d2045292e9a729d3',1,'ms_doy2md(int year, int yday, int *month, int *mday): genutils.c'],['../group__time-related.html#gad742a6973b9b9b28d2045292e9a729d3',1,'ms_doy2md(int year, int yday, int *month, int *mday): genutils.c']]], + ['ms_5fencoding_5fsizetype_66',['ms_encoding_sizetype',['../group__utility-functions.html#ga374946dd5ce740adeb04de57c75049a3',1,'ms_encoding_sizetype(uint8_t encoding, uint8_t *samplesize, char *sampletype): lookup.c'],['../group__utility-functions.html#ga374946dd5ce740adeb04de57c75049a3',1,'ms_encoding_sizetype(uint8_t encoding, uint8_t *samplesize, char *sampletype): lookup.c']]], + ['ms_5fencodingstr_67',['ms_encodingstr',['../group__utility-functions.html#gabff14e9193c56d5280daa1fbeca8ca11',1,'ms_encodingstr(uint8_t encoding): lookup.c'],['../group__utility-functions.html#gabff14e9193c56d5280daa1fbeca8ca11',1,'ms_encodingstr(uint8_t encoding): lookup.c']]], + ['ms_5fendoffile_68',['MS_ENDOFFILE',['../group__return-values.html#gaaa6856cc106d8dcd273bdaa7a48082d0',1,'libmseed.h']]], + ['ms_5fepoch2nstime_69',['MS_EPOCH2NSTIME',['../group__time-related.html#ga8fef1f20d745e86043f312a34c258501',1,'libmseed.h']]], + ['ms_5ferrorstr_70',['ms_errorstr',['../group__utility-functions.html#gac7d8c8a631b2d333da3246610b75f079',1,'ms_errorstr(int errorcode): lookup.c'],['../group__utility-functions.html#gac7d8c8a631b2d333da3246610b75f079',1,'ms_errorstr(int errorcode): lookup.c']]], + ['ms_5fgenerror_71',['MS_GENERROR',['../group__return-values.html#ga3c75238b2d48bd76ce0984444013cbbd',1,'libmseed.h']]], + ['ms_5fhptime2nstime_72',['MS_HPTIME2NSTIME',['../group__time-related.html#ga0aa55e6468514a58e8cef066e8e67e08',1,'libmseed.h']]], + ['ms_5finvalidcrc_73',['MS_INVALIDCRC',['../group__return-values.html#ga19431eeb70d5bc6f495758fc4b9400b8',1,'libmseed.h']]], + ['ms_5fisratetolerable_74',['MS_ISRATETOLERABLE',['../libmseed_8h.html#ab6987950f80d995f6d60cd5a6bf862ca',1,'libmseed.h']]], + ['ms_5flog_75',['ms_log',['../group__logging.html#ga2d51fa9deb29995ef93287db5e7b11c4',1,'libmseed.h']]], + ['ms_5flog_5fl_76',['ms_log_l',['../group__logging.html#ga2a5bd1d7efaa9ffb7de8f5a27c14c5e3',1,'libmseed.h']]], + ['ms_5floginit_77',['ms_loginit',['../group__logging.html#gaef42fde6881f3779eb6cd951da22da2b',1,'libmseed.h']]], + ['ms_5floginit_5fl_78',['ms_loginit_l',['../group__logging.html#gab28337140a09623e59dcbcd6b251a2e2',1,'libmseed.h']]], + ['ms_5fmd2doy_79',['ms_md2doy',['../group__time-related.html#ga560a91cac2f0d1432d81bbeab3c9d55f',1,'ms_md2doy(int year, int month, int mday, int *yday): genutils.c'],['../group__time-related.html#ga560a91cac2f0d1432d81bbeab3c9d55f',1,'ms_md2doy(int year, int month, int mday, int *yday): genutils.c']]], + ['ms_5fmdtimestr2nstime_80',['ms_mdtimestr2nstime',['../group__time-related.html#ga5893363cccc0c798fdf3b93c229c30c6',1,'ms_mdtimestr2nstime(const char *timestr): genutils.c'],['../group__time-related.html#ga5893363cccc0c798fdf3b93c229c30c6',1,'ms_mdtimestr2nstime(const char *timestr): genutils.c']]], + ['ms_5fnoerror_81',['MS_NOERROR',['../group__return-values.html#ga91727033ca93e4d2b47ecb80243b054d',1,'libmseed.h']]], + ['ms_5fnotseed_82',['MS_NOTSEED',['../group__return-values.html#ga40b1ee1e8ea7ceff7d859dbee6ff16aa',1,'libmseed.h']]], + ['ms_5fnslc2sid_83',['ms_nslc2sid',['../group__string-functions.html#gafdad1344eed8e551f2e5f44aee6c43dc',1,'ms_nslc2sid(char *sid, int sidlen, uint16_t flags, const char *net, const char *sta, const char *loc, const char *chan): genutils.c'],['../group__string-functions.html#gafdad1344eed8e551f2e5f44aee6c43dc',1,'ms_nslc2sid(char *sid, int sidlen, uint16_t flags, const char *net, const char *sta, const char *loc, const char *chan): genutils.c']]], + ['ms_5fnstime2epoch_84',['MS_NSTIME2EPOCH',['../group__time-related.html#gae9358c9e3954b15b42cdd4feed0f2092',1,'libmseed.h']]], + ['ms_5fnstime2hptime_85',['MS_NSTIME2HPTIME',['../group__time-related.html#ga20f64b72c763b97d82940f3f22193eec',1,'libmseed.h']]], + ['ms_5fnstime2time_86',['ms_nstime2time',['../group__time-related.html#ga10f96fdc3922538accae65828ffb7fef',1,'ms_nstime2time(nstime_t nstime, uint16_t *year, uint16_t *yday, uint8_t *hour, uint8_t *min, uint8_t *sec, uint32_t *nsec): genutils.c'],['../group__time-related.html#ga10f96fdc3922538accae65828ffb7fef',1,'ms_nstime2time(nstime_t nstime, uint16_t *year, uint16_t *yday, uint8_t *hour, uint8_t *min, uint8_t *sec, uint32_t *nsec): genutils.c']]], + ['ms_5fnstime2timestr_87',['ms_nstime2timestr',['../group__time-related.html#gafc71e63c89345baaba450780d1066235',1,'ms_nstime2timestr(nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subsecond): genutils.c'],['../group__time-related.html#gafc71e63c89345baaba450780d1066235',1,'ms_nstime2timestr(nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subseconds): genutils.c']]], + ['ms_5fnstime2timestrz_88',['ms_nstime2timestrz',['../group__time-related.html#ga60f9507f876917e24bdb9df60c0464e9',1,'ms_nstime2timestrz(nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subsecond): genutils.c'],['../group__time-related.html#ga60f9507f876917e24bdb9df60c0464e9',1,'ms_nstime2timestrz(nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subseconds): genutils.c']]], + ['ms_5foutofrange_89',['MS_OUTOFRANGE',['../group__return-values.html#ga35a815330e2f2a8ccbe27ec6dd56cf84',1,'libmseed.h']]], + ['ms_5fpack_5fdefault_5fencoding_90',['MS_PACK_DEFAULT_ENCODING',['../libmseed_8h.html#aff9883e72216f99d1012d120867ec80e',1,'libmseed.h']]], + ['ms_5fpack_5fdefault_5freclen_91',['MS_PACK_DEFAULT_RECLEN',['../libmseed_8h.html#a7e6e71c654404fdf4a572b4f20040810',1,'libmseed.h']]], + ['ms_5fparse_5fraw2_92',['ms_parse_raw2',['../group__miniseed-record.html#gada80130e27bcf21c659028a725d3d05c',1,'ms_parse_raw2(const char *record, int maxreclen, int8_t details, int8_t swapflag): parseutils.c'],['../group__miniseed-record.html#gada80130e27bcf21c659028a725d3d05c',1,'ms_parse_raw2(const char *record, int maxreclen, int8_t details, int8_t swapflag): parseutils.c']]], + ['ms_5fparse_5fraw3_93',['ms_parse_raw3',['../group__miniseed-record.html#ga90e46dc65a1b70c1e20f54400df1938e',1,'ms_parse_raw3(const char *record, int maxreclen, int8_t details): parseutils.c'],['../group__miniseed-record.html#ga90e46dc65a1b70c1e20f54400df1938e',1,'ms_parse_raw3(const char *record, int maxreclen, int8_t details): parseutils.c']]], + ['ms_5freadleapsecondfile_94',['ms_readleapsecondfile',['../group__leapsecond.html#ga5ccec2d754c60b7ec5688eaabd06c683',1,'ms_readleapsecondfile(const char *filename): genutils.c'],['../group__leapsecond.html#ga5ccec2d754c60b7ec5688eaabd06c683',1,'ms_readleapsecondfile(const char *filename): genutils.c']]], + ['ms_5freadleapseconds_95',['ms_readleapseconds',['../group__leapsecond.html#ga9e5cacc7edef71721637a13781e154dc',1,'ms_readleapseconds(const char *envvarname): genutils.c'],['../group__leapsecond.html#ga9e5cacc7edef71721637a13781e154dc',1,'ms_readleapseconds(const char *envvarname): genutils.c']]], + ['ms_5frlog_96',['ms_rlog',['../group__logging.html#ga7fe4149465b0df172d13f05740de027b',1,'ms_rlog(const char *function, int level, const char *format,...): logging.c'],['../group__logging.html#ga7fe4149465b0df172d13f05740de027b',1,'ms_rlog(const char *function, int level, const char *format,...): logging.c']]], + ['ms_5frlog_5femit_97',['ms_rlog_emit',['../group__logging.html#gaad1e7c2c3a4e65a313bf9009b3461378',1,'ms_rlog_emit(MSLogParam *logp, int count, int context): logging.c'],['../group__logging.html#gaad1e7c2c3a4e65a313bf9009b3461378',1,'ms_rlog_emit(MSLogParam *logp, int count, int context): logging.c']]], + ['ms_5frlog_5ffree_98',['ms_rlog_free',['../group__logging.html#ga6c740db65abf102cedaf2417454914b7',1,'ms_rlog_free(MSLogParam *logp): logging.c'],['../group__logging.html#ga6c740db65abf102cedaf2417454914b7',1,'ms_rlog_free(MSLogParam *logp): logging.c']]], + ['ms_5frlog_5fl_99',['ms_rlog_l',['../group__logging.html#ga0727916fa4de8277dcdcccae692ab509',1,'ms_rlog_l(MSLogParam *logp, const char *function, int level, const char *format,...): logging.c'],['../group__logging.html#ga0727916fa4de8277dcdcccae692ab509',1,'ms_rlog_l(MSLogParam *logp, const char *function, int level, const char *format,...): logging.c']]], + ['ms_5frloginit_100',['ms_rloginit',['../group__logging.html#ga6efb16d950205d060217beb66379390e',1,'ms_rloginit(void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages): logging.c'],['../group__logging.html#ga6efb16d950205d060217beb66379390e',1,'ms_rloginit(void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages): logging.c']]], + ['ms_5frloginit_5fl_101',['ms_rloginit_l',['../group__logging.html#ga0a30e2301bd40aab8501ab367927e51a',1,'ms_rloginit_l(MSLogParam *logp, void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages): logging.c'],['../group__logging.html#ga0a30e2301bd40aab8501ab367927e51a',1,'ms_rloginit_l(MSLogParam *logp, void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages): logging.c']]], + ['ms_5fsamplesize_102',['ms_samplesize',['../group__utility-functions.html#ga3bdd8ee8b678b87ae241157a70e7705d',1,'ms_samplesize(char sampletype): lookup.c'],['../group__utility-functions.html#ga3bdd8ee8b678b87ae241157a70e7705d',1,'ms_samplesize(char sampletype): lookup.c']]], + ['ms_5fsampletime_103',['ms_sampletime',['../group__utility-functions.html#ga729687c8db7037f623515aa1d18c5160',1,'ms_sampletime(nstime_t time, int64_t offset, double samprate): genutils.c'],['../group__utility-functions.html#ga729687c8db7037f623515aa1d18c5160',1,'ms_sampletime(nstime_t time, int64_t offset, double samprate): genutils.c']]], + ['ms_5fseedchan2xchan_104',['ms_seedchan2xchan',['../group__string-functions.html#gad89ccaaeeeca1418dbf879d46ae98994',1,'ms_seedchan2xchan(char *xchan, const char *seedchan): genutils.c'],['../group__string-functions.html#gad89ccaaeeeca1418dbf879d46ae98994',1,'ms_seedchan2xchan(char *xchan, const char *seedchan): genutils.c']]], + ['ms_5fseedtimestr2nstime_105',['ms_seedtimestr2nstime',['../group__time-related.html#ga830b52d87558eb5e4fd79e273c7c69d9',1,'ms_seedtimestr2nstime(const char *seedtimestr): genutils.c'],['../group__time-related.html#ga830b52d87558eb5e4fd79e273c7c69d9',1,'ms_seedtimestr2nstime(const char *seedtimestr): genutils.c']]], + ['ms_5fsid2nslc_106',['ms_sid2nslc',['../group__string-functions.html#ga9efc6e3a3ab30e143dd8ad099b66ae3e',1,'ms_sid2nslc(const char *sid, char *net, char *sta, char *loc, char *chan): genutils.c'],['../group__string-functions.html#ga9efc6e3a3ab30e143dd8ad099b66ae3e',1,'ms_sid2nslc(const char *sid, char *net, char *sta, char *loc, char *chan): genutils.c']]], + ['ms_5fstbadcompflag_107',['MS_STBADCOMPFLAG',['../group__return-values.html#ga3f87d13b334ee4898374355662f3276e',1,'libmseed.h']]], + ['ms_5fstrncpclean_108',['ms_strncpclean',['../group__string-functions.html#gab58b8cec58353914c7e6cb0f7790ee9d',1,'ms_strncpclean(char *dest, const char *source, int length): genutils.c'],['../group__string-functions.html#gab58b8cec58353914c7e6cb0f7790ee9d',1,'ms_strncpclean(char *dest, const char *source, int length): genutils.c']]], + ['ms_5fstrncpcleantail_109',['ms_strncpcleantail',['../group__string-functions.html#gae2a55f7d4a6d8359524466c7a87f49b5',1,'ms_strncpcleantail(char *dest, const char *source, int length): genutils.c'],['../group__string-functions.html#gae2a55f7d4a6d8359524466c7a87f49b5',1,'ms_strncpcleantail(char *dest, const char *source, int length): genutils.c']]], + ['ms_5fstrncpopen_110',['ms_strncpopen',['../group__string-functions.html#ga7cd416b4e8f12205eef09baaa9aff2ff',1,'ms_strncpopen(char *dest, const char *source, int length): genutils.c'],['../group__string-functions.html#ga7cd416b4e8f12205eef09baaa9aff2ff',1,'ms_strncpopen(char *dest, const char *source, int length): genutils.c']]], + ['ms_5fsubseconds_5ft_111',['ms_subseconds_t',['../group__time-related.html#ga5808cba8b50fd42fe1c98c02b579ce90',1,'libmseed.h']]], + ['ms_5ftime2nstime_112',['ms_time2nstime',['../group__time-related.html#gaccd7c7b149cb4f969159b97c48e520f7',1,'ms_time2nstime(int year, int yday, int hour, int min, int sec, uint32_t nsec): genutils.c'],['../group__time-related.html#gaccd7c7b149cb4f969159b97c48e520f7',1,'ms_time2nstime(int year, int yday, int hour, int min, int sec, uint32_t nsec): genutils.c']]], + ['ms_5ftimeformat_5ft_113',['ms_timeformat_t',['../group__time-related.html#ga293bcb6fe5bcc0ff6bc1ff8571fa5372',1,'libmseed.h']]], + ['ms_5ftimestr2nstime_114',['ms_timestr2nstime',['../group__time-related.html#ga5970fa0256338e4964e25941eac6c01e',1,'ms_timestr2nstime(const char *timestr): genutils.c'],['../group__time-related.html#ga5970fa0256338e4964e25941eac6c01e',1,'ms_timestr2nstime(const char *timestr): genutils.c']]], + ['ms_5funknownformat_115',['MS_UNKNOWNFORMAT',['../group__return-values.html#gac6e5775d081228f53af41208e82eab84',1,'libmseed.h']]], + ['ms_5fwronglength_116',['MS_WRONGLENGTH',['../group__return-values.html#ga6c7f6a95898d2e5e557cec1363473ea8',1,'libmseed.h']]], + ['ms_5fxchan2seedchan_117',['ms_xchan2seedchan',['../group__string-functions.html#gabbc0c24e7c7211ae98de00dd3dd7c284',1,'ms_xchan2seedchan(char *seedchan, const char *xchan): genutils.c'],['../group__string-functions.html#gabbc0c24e7c7211ae98de00dd3dd7c284',1,'ms_xchan2seedchan(char *seedchan, const char *xchan): genutils.c']]], + ['mseh_5fadd_5fcalibration_5fr_118',['mseh_add_calibration_r',['../group__extra-headers.html#ga8598d230d89898ef98319782f9d78bcd',1,'mseh_add_calibration_r(MS3Record *msr, const char *ptr, MSEHCalibration *calibration, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga8598d230d89898ef98319782f9d78bcd',1,'mseh_add_calibration_r(MS3Record *msr, const char *ptr, MSEHCalibration *calibration, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fadd_5fevent_5fdetection_5fr_119',['mseh_add_event_detection_r',['../group__extra-headers.html#ga5d7bd17612bbcdbb90a919f053ea6d35',1,'mseh_add_event_detection_r(MS3Record *msr, const char *ptr, MSEHEventDetection *eventdetection, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga5d7bd17612bbcdbb90a919f053ea6d35',1,'mseh_add_event_detection_r(MS3Record *msr, const char *ptr, MSEHEventDetection *eventdetection, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fadd_5frecenter_5fr_120',['mseh_add_recenter_r',['../group__extra-headers.html#gae0b1b765bc8a8968324f937d501b97f0',1,'mseh_add_recenter_r(MS3Record *msr, const char *ptr, MSEHRecenter *recenter, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#gae0b1b765bc8a8968324f937d501b97f0',1,'mseh_add_recenter_r(MS3Record *msr, const char *ptr, MSEHRecenter *recenter, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fadd_5ftiming_5fexception_5fr_121',['mseh_add_timing_exception_r',['../group__extra-headers.html#ga2edc5a29c678ba8bf3519b8fefd70e37',1,'mseh_add_timing_exception_r(MS3Record *msr, const char *ptr, MSEHTimingException *exception, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga2edc5a29c678ba8bf3519b8fefd70e37',1,'mseh_add_timing_exception_r(MS3Record *msr, const char *ptr, MSEHTimingException *exception, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fexists_122',['mseh_exists',['../group__extra-headers.html#ga557fb93974a488bb17cee2b7569b5bfd',1,'libmseed.h']]], + ['mseh_5ffree_5fparsestate_123',['mseh_free_parsestate',['../group__extra-headers.html#ga86ca0bded5d41831bb52bf50a59331b0',1,'mseh_free_parsestate(LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga86ca0bded5d41831bb52bf50a59331b0',1,'mseh_free_parsestate(LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fget_124',['mseh_get',['../group__extra-headers.html#gae40e8d1e85d9774ae66fce5158194c52',1,'libmseed.h']]], + ['mseh_5fget_5fboolean_125',['mseh_get_boolean',['../group__extra-headers.html#gaa6fadf0ead53ec41345159a969293645',1,'libmseed.h']]], + ['mseh_5fget_5fint64_126',['mseh_get_int64',['../group__extra-headers.html#ga50565fb00a750378cf8eb2423870f801',1,'libmseed.h']]], + ['mseh_5fget_5fnumber_127',['mseh_get_number',['../group__extra-headers.html#ga19b5416211b82c396e68ef8df7fec4d9',1,'libmseed.h']]], + ['mseh_5fget_5fptr_5fr_128',['mseh_get_ptr_r',['../group__extra-headers.html#ga81053dd21e2ffcce0302d444f33e19ff',1,'mseh_get_ptr_r(const MS3Record *msr, const char *ptr, void *value, char type, uint32_t maxlength, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga81053dd21e2ffcce0302d444f33e19ff',1,'mseh_get_ptr_r(const MS3Record *msr, const char *ptr, void *value, char type, uint32_t maxlength, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fget_5fstring_129',['mseh_get_string',['../group__extra-headers.html#gac6fc9e988fc284a884ec76aac75e323c',1,'libmseed.h']]], + ['mseh_5fprint_130',['mseh_print',['../group__extra-headers.html#ga4d057eb665121b06a8b51e70776b3eb0',1,'mseh_print(const MS3Record *msr, int indent): extraheaders.c'],['../group__extra-headers.html#ga4d057eb665121b06a8b51e70776b3eb0',1,'mseh_print(const MS3Record *msr, int indent): extraheaders.c']]], + ['mseh_5freplace_131',['mseh_replace',['../group__extra-headers.html#gae1f9322d8a8a528c4b061e72d5c74509',1,'mseh_replace(MS3Record *msr, char *jsonstring): extraheaders.c'],['../group__extra-headers.html#gae1f9322d8a8a528c4b061e72d5c74509',1,'mseh_replace(MS3Record *msr, char *jsonstring): extraheaders.c']]], + ['mseh_5fserialize_132',['mseh_serialize',['../group__extra-headers.html#ga59663ef9985ab0b240b0f8d21ffc9c2d',1,'mseh_serialize(MS3Record *msr, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga59663ef9985ab0b240b0f8d21ffc9c2d',1,'mseh_serialize(MS3Record *msr, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fset_133',['mseh_set',['../group__extra-headers.html#gada12eb8d75667a972d89821c8315fec8',1,'libmseed.h']]], + ['mseh_5fset_5fboolean_134',['mseh_set_boolean',['../group__extra-headers.html#gaeb7fc55bb2e14d594ab3fe95390243d1',1,'libmseed.h']]], + ['mseh_5fset_5fint64_135',['mseh_set_int64',['../group__extra-headers.html#ga061ebe482f1dc591b3c10864e13859de',1,'libmseed.h']]], + ['mseh_5fset_5fnumber_136',['mseh_set_number',['../group__extra-headers.html#gabbbccd09e2ec1fbe947aeb75e24bee17',1,'libmseed.h']]], + ['mseh_5fset_5fptr_5fr_137',['mseh_set_ptr_r',['../group__extra-headers.html#ga91f66b6ace79d28ca08bceae99fde067',1,'mseh_set_ptr_r(MS3Record *msr, const char *ptr, void *value, char type, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga91f66b6ace79d28ca08bceae99fde067',1,'mseh_set_ptr_r(MS3Record *msr, const char *ptr, void *value, char type, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fset_5fstring_138',['mseh_set_string',['../group__extra-headers.html#gaa4b9d6436f570d2be75f320c1b7dd8d0',1,'libmseed.h']]], + ['msehcalibration_139',['MSEHCalibration',['../group__extra-headers.html#struct_m_s_e_h_calibration',1,'']]], + ['mseheventdetection_140',['MSEHEventDetection',['../group__extra-headers.html#struct_m_s_e_h_event_detection',1,'']]], + ['msehrecenter_141',['MSEHRecenter',['../group__extra-headers.html#struct_m_s_e_h_recenter',1,'']]], + ['msehtimingexception_142',['MSEHTimingException',['../group__extra-headers.html#struct_m_s_e_h_timing_exception',1,'']]], + ['msf_5fatendoffile_143',['MSF_ATENDOFFILE',['../group__control-flags.html#ga380ccde8ebf1088c7864924619cb8ee8',1,'libmseed.h']]], + ['msf_5fflushdata_144',['MSF_FLUSHDATA',['../group__control-flags.html#gaae2d9bb856575a556a4ac4dd1ce5f8c5',1,'libmseed.h']]], + ['msf_5fmaintainmstl_145',['MSF_MAINTAINMSTL',['../group__control-flags.html#gabe9cac1fa38474874a30e880cac1b2b5',1,'libmseed.h']]], + ['msf_5fpackver2_146',['MSF_PACKVER2',['../group__control-flags.html#ga7d98fd296c08a35f3c37bef32c5f274f',1,'libmseed.h']]], + ['msf_5fpnamerange_147',['MSF_PNAMERANGE',['../group__control-flags.html#ga902a8e77ba34f70e7cfae2aa5c1f7c8f',1,'libmseed.h']]], + ['msf_5frecordlist_148',['MSF_RECORDLIST',['../group__control-flags.html#gae9e461a94246a154dbf24dd691ff28f6',1,'libmseed.h']]], + ['msf_5fsequence_149',['MSF_SEQUENCE',['../group__control-flags.html#gac73c155f54cb0ffb761c326072bd8ecd',1,'libmseed.h']]], + ['msf_5fskipnotdata_150',['MSF_SKIPNOTDATA',['../group__control-flags.html#ga3ef588c484b70c0a186d16f974e1b4bc',1,'libmseed.h']]], + ['msf_5funpackdata_151',['MSF_UNPACKDATA',['../group__control-flags.html#ga95033e92e20f803ae8e3daebca1a2b5b',1,'libmseed.h']]], + ['msf_5fvalidatecrc_152',['MSF_VALIDATECRC',['../group__control-flags.html#gab06edaad68767eb4f5603d3fcb3eeb13',1,'libmseed.h']]], + ['mslogentry_153',['MSLogEntry',['../group__logging.html#struct_m_s_log_entry',1,'']]], + ['mslogparam_154',['MSLogParam',['../struct_m_s_log_param.html',1,'']]], + ['mslogparam_5finitializer_155',['MSLogParam_INITIALIZER',['../group__logging.html#ga1bcf30fa46fa91b23f535c23ce490268',1,'libmseed.h']]], + ['mslogregistry_156',['MSLogRegistry',['../group__logging.html#struct_m_s_log_registry',1,'']]], + ['mslogregistry_5finitializer_157',['MSLogRegistry_INITIALIZER',['../group__logging.html#gad460ea20adf13f9fd74569a686877845',1,'libmseed.h']]], + ['msr_158',['msr',['../group__record-list.html#a7f0f4ea6a4bb9dac1357378dbfc3145a',1,'MS3RecordPtr']]], + ['msr3_5fdata_5fbounds_159',['msr3_data_bounds',['../group__miniseed-record.html#gaf7485dd9cdd6d7afcc00217f27433c04',1,'msr3_data_bounds(const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize): unpack.c'],['../group__miniseed-record.html#gaf7485dd9cdd6d7afcc00217f27433c04',1,'msr3_data_bounds(const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize): unpack.c']]], + ['msr3_5fduplicate_160',['msr3_duplicate',['../group__miniseed-record.html#gac06160223d7a9c60cd0d5b6e769f9c32',1,'msr3_duplicate(const MS3Record *msr, int8_t datadup): msrutils.c'],['../group__miniseed-record.html#gac06160223d7a9c60cd0d5b6e769f9c32',1,'msr3_duplicate(const MS3Record *msr, int8_t datadup): msrutils.c']]], + ['msr3_5fendtime_161',['msr3_endtime',['../group__miniseed-record.html#gac4fffbd1b07e9bc04a04dcbd02e1d80d',1,'msr3_endtime(const MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#gac4fffbd1b07e9bc04a04dcbd02e1d80d',1,'msr3_endtime(const MS3Record *msr): msrutils.c']]], + ['msr3_5ffree_162',['msr3_free',['../group__miniseed-record.html#ga72e0d55e9200bbdda71d157cd8939d4e',1,'msr3_free(MS3Record **ppmsr): msrutils.c'],['../group__miniseed-record.html#ga72e0d55e9200bbdda71d157cd8939d4e',1,'msr3_free(MS3Record **ppmsr): msrutils.c']]], + ['msr3_5fhost_5flatency_163',['msr3_host_latency',['../group__miniseed-record.html#ga5d2746d2fc34c6238682cd72b63d1bf5',1,'msr3_host_latency(const MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#ga5d2746d2fc34c6238682cd72b63d1bf5',1,'msr3_host_latency(const MS3Record *msr): msrutils.c']]], + ['msr3_5finit_164',['msr3_init',['../group__miniseed-record.html#ga45b12b97428e86249ee371ca0fd61473',1,'msr3_init(MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#ga45b12b97428e86249ee371ca0fd61473',1,'msr3_init(MS3Record *msr): msrutils.c']]], + ['msr3_5fmatchselect_165',['msr3_matchselect',['../group__data-selections.html#gad7ea4a66a5026e3df93ce9c7f0f287f3',1,'msr3_matchselect(const MS3Selections *selections, const MS3Record *msr, const MS3SelectTime **ppselecttime): selection.c'],['../group__data-selections.html#gad7ea4a66a5026e3df93ce9c7f0f287f3',1,'msr3_matchselect(const MS3Selections *selections, const MS3Record *msr, const MS3SelectTime **ppselecttime): selection.c']]], + ['msr3_5fpack_166',['msr3_pack',['../group__miniseed-record.html#gaf8260a62b2fb6b312664dc054d818e43',1,'msr3_pack(const MS3Record *msr, void(*record_handler)(char *, int, void *), void *handlerdata, int64_t *packedsamples, uint32_t flags, int8_t verbose): pack.c'],['../group__miniseed-record.html#gaf8260a62b2fb6b312664dc054d818e43',1,'msr3_pack(const MS3Record *msr, void(*record_handler)(char *, int, void *), void *handlerdata, int64_t *packedsamples, uint32_t flags, int8_t verbose): pack.c']]], + ['msr3_5fpack_5fheader2_167',['msr3_pack_header2',['../group__miniseed-record.html#ga6b88319a7327b4684c852af1942fde8e',1,'msr3_pack_header2(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c'],['../group__miniseed-record.html#ga6b88319a7327b4684c852af1942fde8e',1,'msr3_pack_header2(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c']]], + ['msr3_5fpack_5fheader3_168',['msr3_pack_header3',['../group__miniseed-record.html#gae4c2f6c895035165dd21581c01c0abb4',1,'msr3_pack_header3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c'],['../group__miniseed-record.html#gae4c2f6c895035165dd21581c01c0abb4',1,'msr3_pack_header3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c']]], + ['msr3_5fparse_169',['msr3_parse',['../group__miniseed-record.html#gaa8ec8453b225512960e4a44fe2bca938',1,'msr3_parse(const char *record, uint64_t recbuflen, MS3Record **ppmsr, uint32_t flags, int8_t verbose): parseutils.c'],['../group__miniseed-record.html#gaa8ec8453b225512960e4a44fe2bca938',1,'msr3_parse(const char *record, uint64_t recbuflen, MS3Record **ppmsr, uint32_t flags, int8_t verbose): parseutils.c']]], + ['msr3_5fprint_170',['msr3_print',['../group__miniseed-record.html#ga44e8cc87ec2b036ae23d76350edba59b',1,'msr3_print(const MS3Record *msr, int8_t details): msrutils.c'],['../group__miniseed-record.html#ga44e8cc87ec2b036ae23d76350edba59b',1,'msr3_print(const MS3Record *msr, int8_t details): msrutils.c']]], + ['msr3_5frepack_5fmseed3_171',['msr3_repack_mseed3',['../group__miniseed-record.html#ga2bcbc4dab5da941a83dac8494f56d06b',1,'msr3_repack_mseed3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c'],['../group__miniseed-record.html#ga2bcbc4dab5da941a83dac8494f56d06b',1,'msr3_repack_mseed3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c']]], + ['msr3_5fresize_5fbuffer_172',['msr3_resize_buffer',['../group__miniseed-record.html#ga9671336c6a76c5df2ea9bb41ee1c2afc',1,'msr3_resize_buffer(MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#ga9671336c6a76c5df2ea9bb41ee1c2afc',1,'msr3_resize_buffer(MS3Record *msr): msrutils.c']]], + ['msr3_5fsampratehz_173',['msr3_sampratehz',['../group__miniseed-record.html#ga47ab9421c5081a17078909bc950b4d93',1,'msr3_sampratehz(const MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#ga47ab9421c5081a17078909bc950b4d93',1,'msr3_sampratehz(const MS3Record *msr): msrutils.c']]], + ['msr3_5funpack_5fdata_174',['msr3_unpack_data',['../group__miniseed-record.html#ga4d9056f00de1252658d3f2c6562576ee',1,'msr3_unpack_data(MS3Record *msr, int8_t verbose): unpack.c'],['../group__miniseed-record.html#ga4d9056f00de1252658d3f2c6562576ee',1,'msr3_unpack_data(MS3Record *msr, int8_t verbose): unpack.c']]], + ['msr3_5fwritemseed_175',['msr3_writemseed',['../group__io-functions.html#gaf2d6e0ee8e0cdc39add72816ca56ce4c',1,'msr3_writemseed(MS3Record *msr, const char *mspath, int8_t overwrite, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#gaf2d6e0ee8e0cdc39add72816ca56ce4c',1,'msr3_writemseed(MS3Record *msr, const char *mspath, int8_t overwrite, uint32_t flags, int8_t verbose): fileutils.c']]], + ['msswap_5fheader_176',['MSSWAP_HEADER',['../group__byte-swap-flags.html#gabbe61c501d934c23e8244389a235269d',1,'libmseed.h']]], + ['msswap_5fpayload_177',['MSSWAP_PAYLOAD',['../group__byte-swap-flags.html#gabd4c029f9fcb840411b85a28f25d89e4',1,'libmseed.h']]], + ['mstl3_5faddmsr_178',['mstl3_addmsr',['../group__trace-list.html#ga9f56917332e05aa2e22c167014f9efed',1,'libmseed.h']]], + ['mstl3_5faddmsr_5frecordptr_179',['mstl3_addmsr_recordptr',['../group__trace-list.html#gaeb2f26a676d1db8e1bffd208df6877d1',1,'mstl3_addmsr_recordptr(MS3TraceList *mstl, const MS3Record *msr, MS3RecordPtr **pprecptr, int8_t splitversion, int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance): tracelist.c'],['../group__trace-list.html#gaeb2f26a676d1db8e1bffd208df6877d1',1,'mstl3_addmsr_recordptr(MS3TraceList *mstl, const MS3Record *msr, MS3RecordPtr **pprecptr, int8_t splitversion, int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance): tracelist.c']]], + ['mstl3_5fconvertsamples_180',['mstl3_convertsamples',['../group__trace-list.html#gac1cbcdce4bf2acd1c9f536efed1b0b66',1,'mstl3_convertsamples(MS3TraceSeg *seg, char type, int8_t truncate): tracelist.c'],['../group__trace-list.html#gac1cbcdce4bf2acd1c9f536efed1b0b66',1,'mstl3_convertsamples(MS3TraceSeg *seg, char type, int8_t truncate): tracelist.c']]], + ['mstl3_5ffindid_181',['mstl3_findID',['../group__trace-list.html#gad9b8a46cc920a664c65faa6cfd28b27c',1,'mstl3_findID(MS3TraceList *mstl, const char *sid, uint8_t pubversion, MS3TraceID **prev): tracelist.c'],['../group__trace-list.html#gad9b8a46cc920a664c65faa6cfd28b27c',1,'mstl3_findID(MS3TraceList *mstl, const char *sid, uint8_t pubversion, MS3TraceID **prev): tracelist.c']]], + ['mstl3_5ffree_182',['mstl3_free',['../group__trace-list.html#ga2a436ab4eb7cd653e52e6760c2f51f20',1,'mstl3_free(MS3TraceList **ppmstl, int8_t freeprvtptr): tracelist.c'],['../group__trace-list.html#ga2a436ab4eb7cd653e52e6760c2f51f20',1,'mstl3_free(MS3TraceList **ppmstl, int8_t freeprvtptr): tracelist.c']]], + ['mstl3_5finit_183',['mstl3_init',['../group__trace-list.html#gac23dc184eac5bbfec546e1079ea4aed7',1,'mstl3_init(MS3TraceList *mstl): tracelist.c'],['../group__trace-list.html#gac23dc184eac5bbfec546e1079ea4aed7',1,'mstl3_init(MS3TraceList *mstl): tracelist.c']]], + ['mstl3_5fpack_184',['mstl3_pack',['../group__trace-list.html#ga28697b648a1390ae480fdcf75a478079',1,'mstl3_pack(MS3TraceList *mstl, void(*record_handler)(char *, int, void *), void *handlerdata, int reclen, int8_t encoding, int64_t *packedsamples, uint32_t flags, int8_t verbose, char *extra): tracelist.c'],['../group__trace-list.html#ga28697b648a1390ae480fdcf75a478079',1,'mstl3_pack(MS3TraceList *mstl, void(*record_handler)(char *, int, void *), void *handlerdata, int reclen, int8_t encoding, int64_t *packedsamples, uint32_t flags, int8_t verbose, char *extra): tracelist.c']]], + ['mstl3_5fprintgaplist_185',['mstl3_printgaplist',['../group__trace-list.html#ga53bcc4905d5181d82227429860c84acb',1,'mstl3_printgaplist(const MS3TraceList *mstl, ms_timeformat_t timeformat, double *mingap, double *maxgap): tracelist.c'],['../group__trace-list.html#ga53bcc4905d5181d82227429860c84acb',1,'mstl3_printgaplist(const MS3TraceList *mstl, ms_timeformat_t timeformat, double *mingap, double *maxgap): tracelist.c']]], + ['mstl3_5fprintsynclist_186',['mstl3_printsynclist',['../group__trace-list.html#ga1230e91bdd8d278ec16e0fb315cf03f2',1,'mstl3_printsynclist(const MS3TraceList *mstl, const char *dccid, ms_subseconds_t subseconds): tracelist.c'],['../group__trace-list.html#ga1230e91bdd8d278ec16e0fb315cf03f2',1,'mstl3_printsynclist(const MS3TraceList *mstl, const char *dccid, ms_subseconds_t subseconds): tracelist.c']]], + ['mstl3_5fprinttracelist_187',['mstl3_printtracelist',['../group__trace-list.html#ga22651f0c2129e2f804899264b0822549',1,'mstl3_printtracelist(const MS3TraceList *mstl, ms_timeformat_t timeformat, int8_t details, int8_t gaps, int8_t versions): tracelist.c'],['../group__trace-list.html#ga22651f0c2129e2f804899264b0822549',1,'mstl3_printtracelist(const MS3TraceList *mstl, ms_timeformat_t timeformat, int8_t details, int8_t gaps, int8_t versions): tracelist.c']]], + ['mstl3_5freadbuffer_188',['mstl3_readbuffer',['../group__trace-list.html#ga43440b2eb6cb7be2a09cd54a856de718',1,'mstl3_readbuffer(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, int8_t verbose): tracelist.c'],['../group__trace-list.html#ga43440b2eb6cb7be2a09cd54a856de718',1,'mstl3_readbuffer(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, int8_t verbose): tracelist.c']]], + ['mstl3_5freadbuffer_5fselection_189',['mstl3_readbuffer_selection',['../group__trace-list.html#ga93a56335318fd6f55f4783c2a87f5a7b',1,'mstl3_readbuffer_selection(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t verbose): tracelist.c'],['../group__trace-list.html#ga93a56335318fd6f55f4783c2a87f5a7b',1,'mstl3_readbuffer_selection(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t verbose): tracelist.c']]], + ['mstl3_5fresize_5fbuffers_190',['mstl3_resize_buffers',['../group__trace-list.html#ga922cf4103228d208a80e2c2c7a5c97ee',1,'mstl3_resize_buffers(MS3TraceList *mstl): tracelist.c'],['../group__trace-list.html#ga922cf4103228d208a80e2c2c7a5c97ee',1,'mstl3_resize_buffers(MS3TraceList *mstl): tracelist.c']]], + ['mstl3_5funpack_5frecordlist_191',['mstl3_unpack_recordlist',['../group__trace-list.html#ga061e55ff1eac9da605f8bc2bebb70848',1,'mstl3_unpack_recordlist(MS3TraceID *id, MS3TraceSeg *seg, void *output, uint64_t outputsize, int8_t verbose): tracelist.c'],['../group__trace-list.html#ga061e55ff1eac9da605f8bc2bebb70848',1,'mstl3_unpack_recordlist(MS3TraceID *id, MS3TraceSeg *seg, void *output, uint64_t outputsize, int8_t verbose): tracelist.c']]], + ['mstl3_5fwritemseed_192',['mstl3_writemseed',['../group__io-functions.html#gaca13b52a989f8e86a1f2c96f0ad853ba',1,'mstl3_writemseed(MS3TraceList *mst, const char *mspath, int8_t overwrite, int maxreclen, int8_t encoding, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#gaca13b52a989f8e86a1f2c96f0ad853ba',1,'mstl3_writemseed(MS3TraceList *mstl, const char *mspath, int8_t overwrite, int maxreclen, int8_t encoding, uint32_t flags, int8_t verbose): fileutils.c']]], + ['mstraceid_5fskiplist_5fheight_193',['MSTRACEID_SKIPLIST_HEIGHT',['../group__trace-list.html#gacad4d23c4594c114b3337ec454f5d722',1,'libmseed.h']]], + ['my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_194',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]] +]; diff --git a/search/all_d.js b/search/all_d.js new file mode 100644 index 0000000..edcb098 --- /dev/null +++ b/search/all_d.js @@ -0,0 +1,17 @@ +var searchData= +[ + ['need_20attention_0',['Need attention',['../porting-guide.html#porting-important',1,'Most important changes that commonly need attention'],['../porting-guide.html#porting-other',1,'Other changes that may need attention']]], + ['need_20to_20use_20separate_20fdsn_20identifiers_20of_20network_20station_20location_20and_20channel_1',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['need_20what_20can_20i_20do_20how_20can_20i_20contribute_2',['This library is great, but doesn't do something I need. What can I do? How can I contribute?',['../page-faq.html#faq-10',1,'']]], + ['needed_3',['miniSEED is simple, why is a library needed?',['../page-faq.html#faq-4',1,'']]], + ['network_20station_20location_20and_20channel_4',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['next_5',['next',['../group__data-selections.html#a01aa5ed07a316e9e43f1f44ca521f0d1',1,'MS3SelectTime::next'],['../group__data-selections.html#a70e1e7c55183b17a97fa4fd8ccbef169',1,'MS3Selections::next'],['../group__record-list.html#a018dad92203bb08aa5b66f3d618c0b8f',1,'MS3RecordPtr::next'],['../group__trace-list.html#ad5acfe831d046c60102414e333cb46a3',1,'MS3TraceSeg::next'],['../group__trace-list.html#a026f424aa241a1f8a1852b4ab58416ff',1,'MS3TraceID::next'],['../group__extra-headers.html#a242fb0859a2cf71f53b952ece46b54f7',1,'MSEHEventDetection::next'],['../group__extra-headers.html#a39fa727a5e4ad5f99c85c9c01ef5dd50',1,'MSEHCalibration::next'],['../group__leapsecond.html#ad7300066b28c4ef340d245cec626dc19',1,'LeapSecond::next']]], + ['noise_6',['noise',['../group__extra-headers.html#a980df9835da6cfdda10a8fe8cb071a72',1,'MSEHCalibration']]], + ['nsterror_7',['NSTERROR',['../group__time-related.html#ga004220ac3fbe2b40dfc81da8b2edafb1',1,'libmseed.h']]], + ['nstime_5ft_8',['nstime_t',['../group__time-related.html#ga895cc29aec627a81605312ca77bc2174',1,'libmseed.h']]], + ['nstmodulus_9',['NSTMODULUS',['../group__time-related.html#gaa6b320ab4965a7ae35b20c160044ed0d',1,'libmseed.h']]], + ['nstunset_10',['NSTUNSET',['../group__time-related.html#ga67e5181a415f4d49dcc8b83b3653e672',1,'libmseed.h']]], + ['numsamples_11',['numsamples',['../group__miniseed-record.html#a7871a3c78d7ecb7c30c6526aa1fd9718',1,'MS3Record::numsamples'],['../group__trace-list.html#a04a949bf1a75ed3008e22243922fe53c',1,'MS3TraceSeg::numsamples']]], + ['numsegments_12',['numsegments',['../group__trace-list.html#afdbdeb4baba7b1b2bbdb92738344b70c',1,'MS3TraceID']]], + ['numtraceids_13',['numtraceids',['../group__trace-list.html#ab52ad604522dafcd53faf4c7fede743c',1,'MS3TraceList']]] +]; diff --git a/search/all_e.js b/search/all_e.js new file mode 100644 index 0000000..9e84228 --- /dev/null +++ b/search/all_e.js @@ -0,0 +1,10 @@ +var searchData= +[ + ['o_0',['File and URL I/O',['../group__io-functions.html',1,'']]], + ['of_20network_20station_20location_20and_20channel_1',['I need to use separate FDSN identifiers of Network, Station, Location and Channel.',['../page-faq.html#faq-6',1,'']]], + ['of_20the_20library_2',['Porting from earlier version of the library',['../index.html#porting-main',1,'']]], + ['onsettime_3',['onsettime',['../group__extra-headers.html#a2efbb62f79294e87e2a3e5bd3724312d',1,'MSEHEventDetection']]], + ['other_20changes_20that_20may_20need_20attention_4',['Other changes that may need attention',['../porting-guide.html#porting-other',1,'']]], + ['overview_5',['Overview',['../page-capabilities.html#overview',1,'Overview'],['../page-examples.html#examples-overview',1,'Overview']]], + ['overview_20and_20approach_6',['Overview and approach',['../porting-guide.html#porting-overview',1,'']]] +]; diff --git a/search/all_f.js b/search/all_f.js new file mode 100644 index 0000000..7d7576b --- /dev/null +++ b/search/all_f.js @@ -0,0 +1,14 @@ +var searchData= +[ + ['parallel_0',['Reading files in parallel',['../page-examples.html#example-lm_pararead',1,'']]], + ['path_1',['path',['../group__io-functions.html#aa6fd4470dad259883c0da5b2fbf01747',1,'MS3FileParam']]], + ['port_20my_20libmseed_202_20x_20program_20to_20the_203_20x_20api_2',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['porting_20from_20earlier_20libmseed_20versions_3',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]], + ['porting_20from_20earlier_20version_20of_20the_20library_4',['Porting from earlier version of the library',['../index.html#porting-main',1,'']]], + ['prev_5',['prev',['../group__trace-list.html#aa48053acc5c80c8f6b1e18f03d46f931',1,'MS3TraceSeg']]], + ['prisize_5ft_6',['PRIsize_t',['../libmseed_8h.html#af847123129aadbc5ea749d63ef0ce82f',1,'libmseed.h']]], + ['prngstate_7',['prngstate',['../group__trace-list.html#a1426c08e1f4239b38ac7eb6d6e6fc7d4',1,'MS3TraceList']]], + ['program_20to_20the_203_20x_20api_8',['The library API changed! Why? How do I port my libmseed 2.x program to the 3.x API?',['../page-faq.html#faq-7',1,'']]], + ['prvtptr_9',['prvtptr',['../group__record-list.html#a2cf5110861a2742886d686396146a756',1,'MS3RecordPtr::prvtptr'],['../group__trace-list.html#a4b0c9a4002389c65dc2a5b8f0a549441',1,'MS3TraceSeg::prvtptr'],['../group__trace-list.html#a706e13d72ad8638eaa7b9d81d4529ac3',1,'MS3TraceID::prvtptr']]], + ['pubversion_10',['pubversion',['../group__miniseed-record.html#aef0f37c7df7a014ff18c123187cda1b6',1,'MS3Record::pubversion'],['../group__data-selections.html#a49fd06d33cf3c0a401d0bc3cc20dd5c6',1,'MS3Selections::pubversion'],['../group__trace-list.html#a49a7a751c8f59f769ec3b6e29e8aacfd',1,'MS3TraceID::pubversion']]] +]; diff --git a/search/classes_0.js b/search/classes_0.js new file mode 100644 index 0000000..507ce8f --- /dev/null +++ b/search/classes_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['leapsecond_0',['LeapSecond',['../group__leapsecond.html#struct_leap_second',1,'']]], + ['libmseed_5fmemory_1',['LIBMSEED_MEMORY',['../struct_l_i_b_m_s_e_e_d___m_e_m_o_r_y.html',1,'']]], + ['lmio_2',['LMIO',['../struct_l_m_i_o.html',1,'']]] +]; diff --git a/search/classes_1.js b/search/classes_1.js new file mode 100644 index 0000000..c1a5500 --- /dev/null +++ b/search/classes_1.js @@ -0,0 +1,20 @@ +var searchData= +[ + ['ms3fileparam_0',['MS3FileParam',['../group__io-functions.html#struct_m_s3_file_param',1,'']]], + ['ms3record_1',['MS3Record',['../group__miniseed-record.html#struct_m_s3_record',1,'']]], + ['ms3recordlist_2',['MS3RecordList',['../group__record-list.html#struct_m_s3_record_list',1,'']]], + ['ms3recordptr_3',['MS3RecordPtr',['../group__record-list.html#struct_m_s3_record_ptr',1,'']]], + ['ms3selections_4',['MS3Selections',['../group__data-selections.html#struct_m_s3_selections',1,'']]], + ['ms3selecttime_5',['MS3SelectTime',['../group__data-selections.html#struct_m_s3_select_time',1,'']]], + ['ms3tolerance_6',['MS3Tolerance',['../struct_m_s3_tolerance.html',1,'']]], + ['ms3traceid_7',['MS3TraceID',['../group__trace-list.html#struct_m_s3_trace_i_d',1,'']]], + ['ms3tracelist_8',['MS3TraceList',['../group__trace-list.html#struct_m_s3_trace_list',1,'']]], + ['ms3traceseg_9',['MS3TraceSeg',['../group__trace-list.html#struct_m_s3_trace_seg',1,'']]], + ['msehcalibration_10',['MSEHCalibration',['../group__extra-headers.html#struct_m_s_e_h_calibration',1,'']]], + ['mseheventdetection_11',['MSEHEventDetection',['../group__extra-headers.html#struct_m_s_e_h_event_detection',1,'']]], + ['msehrecenter_12',['MSEHRecenter',['../group__extra-headers.html#struct_m_s_e_h_recenter',1,'']]], + ['msehtimingexception_13',['MSEHTimingException',['../group__extra-headers.html#struct_m_s_e_h_timing_exception',1,'']]], + ['mslogentry_14',['MSLogEntry',['../group__logging.html#struct_m_s_log_entry',1,'']]], + ['mslogparam_15',['MSLogParam',['../struct_m_s_log_param.html',1,'']]], + ['mslogregistry_16',['MSLogRegistry',['../group__logging.html#struct_m_s_log_registry',1,'']]] +]; diff --git a/search/close.svg b/search/close.svg new file mode 100644 index 0000000..337d6cc --- /dev/null +++ b/search/close.svg @@ -0,0 +1,18 @@ + + + + + + diff --git a/search/defines_0.js b/search/defines_0.js new file mode 100644 index 0000000..2debe6d --- /dev/null +++ b/search/defines_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['bit_0',['bit',['../libmseed_8h.html#a3076542deab591bf8b867904cc6e416b',1,'libmseed.h']]] +]; diff --git a/search/defines_1.js b/search/defines_1.js new file mode 100644 index 0000000..35e0ab3 --- /dev/null +++ b/search/defines_1.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['de_5fascii_0',['DE_ASCII',['../libmseed_8h.html#a0e4d3b0ef76ca9b3e19b2b9f597bc539',1,'libmseed.h']]], + ['deprecated_1',['DEPRECATED',['../libmseed_8h.html#ac1e8a42306d8e67cb94ca31c3956ee78',1,'libmseed.h']]] +]; diff --git a/search/defines_2.js b/search/defines_2.js new file mode 100644 index 0000000..08675ac --- /dev/null +++ b/search/defines_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['libmseed_5frelease_0',['LIBMSEED_RELEASE',['../libmseed_8h.html#ada98297f78bcc0e44b305e2686587c31',1,'libmseed.h']]], + ['libmseed_5fversion_1',['LIBMSEED_VERSION',['../libmseed_8h.html#a20c5bfa50e3cd86ca63aba405111fc50',1,'libmseed.h']]], + ['lm_5fsidlen_2',['LM_SIDLEN',['../libmseed_8h.html#a35732636583abd22ed0307c5d2576493',1,'libmseed.h']]] +]; diff --git a/search/defines_3.js b/search/defines_3.js new file mode 100644 index 0000000..4185d49 --- /dev/null +++ b/search/defines_3.js @@ -0,0 +1,12 @@ +var searchData= +[ + ['maxreclen_0',['MAXRECLEN',['../libmseed_8h.html#ace2e140b5467fa3bc3bde66bb27ad30c',1,'libmseed.h']]], + ['maxreclenv2_1',['MAXRECLENv2',['../libmseed_8h.html#a9cce04d2a8e17d6b767fe43e44fecf08',1,'libmseed.h']]], + ['minreclen_2',['MINRECLEN',['../libmseed_8h.html#a22b93f8754191985699fc159c81c12af',1,'libmseed.h']]], + ['ms2_5fisdataindicator_3',['MS2_ISDATAINDICATOR',['../libmseed_8h.html#a2406be03c7519a2248f46021a9dd28a4',1,'libmseed.h']]], + ['ms2_5fisvalidheader_4',['MS2_ISVALIDHEADER',['../libmseed_8h.html#aadb6dda3b0b229eb07ec8e4aa0b6deff',1,'libmseed.h']]], + ['ms3_5fisvalidheader_5',['MS3_ISVALIDHEADER',['../libmseed_8h.html#a8c65f1afa8e4653870ecf54b4ba0a4f0',1,'libmseed.h']]], + ['ms_5fisratetolerable_6',['MS_ISRATETOLERABLE',['../libmseed_8h.html#ab6987950f80d995f6d60cd5a6bf862ca',1,'libmseed.h']]], + ['ms_5fpack_5fdefault_5fencoding_7',['MS_PACK_DEFAULT_ENCODING',['../libmseed_8h.html#aff9883e72216f99d1012d120867ec80e',1,'libmseed.h']]], + ['ms_5fpack_5fdefault_5freclen_8',['MS_PACK_DEFAULT_RECLEN',['../libmseed_8h.html#a7e6e71c654404fdf4a572b4f20040810',1,'libmseed.h']]] +]; diff --git a/search/defines_4.js b/search/defines_4.js new file mode 100644 index 0000000..319ca19 --- /dev/null +++ b/search/defines_4.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['prisize_5ft_0',['PRIsize_t',['../libmseed_8h.html#af847123129aadbc5ea749d63ef0ce82f',1,'libmseed.h']]] +]; diff --git a/search/enums_0.js b/search/enums_0.js new file mode 100644 index 0000000..04f1e53 --- /dev/null +++ b/search/enums_0.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['ms_5fsubseconds_5ft_0',['ms_subseconds_t',['../group__time-related.html#ga5808cba8b50fd42fe1c98c02b579ce90',1,'libmseed.h']]], + ['ms_5ftimeformat_5ft_1',['ms_timeformat_t',['../group__time-related.html#ga293bcb6fe5bcc0ff6bc1ff8571fa5372',1,'libmseed.h']]] +]; diff --git a/search/enumvalues_0.js b/search/enumvalues_0.js new file mode 100644 index 0000000..7d0f8ef --- /dev/null +++ b/search/enumvalues_0.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['lmio_5ffd_0',['LMIO_FD',['../struct_l_m_i_o.html#aefbfc81ee19aa0079ae479cdabcb0b10a4aa4eae188827b75ab0d852939617ba0',1,'LMIO']]], + ['lmio_5ffile_1',['LMIO_FILE',['../struct_l_m_i_o.html#aefbfc81ee19aa0079ae479cdabcb0b10aef1c9b46c67bf1c58f36c138d6ce033b',1,'LMIO']]], + ['lmio_5fnull_2',['LMIO_NULL',['../struct_l_m_i_o.html#aefbfc81ee19aa0079ae479cdabcb0b10abf5a0271489387d7b969f1291d3b631b',1,'LMIO']]], + ['lmio_5furl_3',['LMIO_URL',['../struct_l_m_i_o.html#aefbfc81ee19aa0079ae479cdabcb0b10a4d21b71edf1f7b316cdc5a92290c90f2',1,'LMIO']]] +]; diff --git a/search/files_0.js b/search/files_0.js new file mode 100644 index 0000000..78f56da --- /dev/null +++ b/search/files_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['libmseed_2eh_0',['libmseed.h',['../libmseed_8h.html',1,'']]] +]; diff --git a/search/functions_0.js b/search/functions_0.js new file mode 100644 index 0000000..ba8b715 --- /dev/null +++ b/search/functions_0.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['libmseed_5fmemory_5fprealloc_0',['libmseed_memory_prealloc',['../group__memory-allocators.html#ga8f4c33db1225981c896f62329ad16f3b',1,'libmseed.h']]], + ['libmseed_5furl_5fsupport_1',['libmseed_url_support',['../group__io-functions.html#gaae2aee8ed2ea3bce6aa164e6c653c5c7',1,'libmseed_url_support(void): fileutils.c'],['../group__io-functions.html#gaae2aee8ed2ea3bce6aa164e6c653c5c7',1,'libmseed_url_support(void): fileutils.c']]], + ['lmp_5ffseek64_2',['lmp_fseek64',['../group__utility-functions.html#ga92c4ecd16a9937d4f522e490f79635a1',1,'libmseed.h']]], + ['lmp_5fftell64_3',['lmp_ftell64',['../group__utility-functions.html#gaa742c658d2e2a7d9395b0306c3b86645',1,'libmseed.h']]], + ['lmp_5fnanosleep_4',['lmp_nanosleep',['../group__utility-functions.html#ga681383c813edfa05512c2e4cc4bad263',1,'libmseed.h']]] +]; diff --git a/search/functions_1.js b/search/functions_1.js new file mode 100644 index 0000000..743cafd --- /dev/null +++ b/search/functions_1.js @@ -0,0 +1,97 @@ +var searchData= +[ + ['ms3_5faddselect_0',['ms3_addselect',['../group__data-selections.html#ga01488fc141d7bb72a384bbb7ff7967a1',1,'ms3_addselect(MS3Selections **ppselections, const char *sidpattern, nstime_t starttime, nstime_t endtime, uint8_t pubversion): selection.c'],['../group__data-selections.html#ga01488fc141d7bb72a384bbb7ff7967a1',1,'ms3_addselect(MS3Selections **ppselections, const char *sidpattern, nstime_t starttime, nstime_t endtime, uint8_t pubversion): selection.c']]], + ['ms3_5faddselect_5fcomp_1',['ms3_addselect_comp',['../group__data-selections.html#gad4c0405d54cca1c60eed151e38a84cb7',1,'ms3_addselect_comp(MS3Selections **ppselections, char *network, char *station, char *location, char *channel, nstime_t starttime, nstime_t endtime, uint8_t pubversion): selection.c'],['../group__data-selections.html#gad4c0405d54cca1c60eed151e38a84cb7',1,'ms3_addselect_comp(MS3Selections **ppselections, char *network, char *station, char *location, char *channel, nstime_t starttime, nstime_t endtime, uint8_t pubversion): selection.c']]], + ['ms3_5fdetect_2',['ms3_detect',['../group__miniseed-record.html#ga1a531100f0355126420e7d163fb9f2d4',1,'ms3_detect(const char *record, uint64_t recbuflen, uint8_t *formatversion): parseutils.c'],['../group__miniseed-record.html#ga1a531100f0355126420e7d163fb9f2d4',1,'ms3_detect(const char *record, uint64_t recbuflen, uint8_t *formatversion): parseutils.c']]], + ['ms3_5ffreeselections_3',['ms3_freeselections',['../group__data-selections.html#ga63f765d5d879a6e9c065e56c47a9d053',1,'ms3_freeselections(MS3Selections *selections): selection.c'],['../group__data-selections.html#ga63f765d5d879a6e9c065e56c47a9d053',1,'ms3_freeselections(MS3Selections *selections): selection.c']]], + ['ms3_5fmatchselect_4',['ms3_matchselect',['../group__data-selections.html#gad1d54978fe865036332699767be34957',1,'ms3_matchselect(const MS3Selections *selections, const char *sid, nstime_t starttime, nstime_t endtime, int pubversion, const MS3SelectTime **ppselecttime): selection.c'],['../group__data-selections.html#gad1d54978fe865036332699767be34957',1,'ms3_matchselect(const MS3Selections *selections, const char *sid, nstime_t starttime, nstime_t endtime, int pubversion, const MS3SelectTime **ppselecttime): selection.c']]], + ['ms3_5fmstl_5finit_5ffd_5',['ms3_mstl_init_fd',['../group__io-functions.html#gae9b315964d905bd43833c93072bcc309',1,'ms3_mstl_init_fd(int fd): fileutils.c'],['../group__io-functions.html#gae9b315964d905bd43833c93072bcc309',1,'ms3_mstl_init_fd(int fd): fileutils.c']]], + ['ms3_5fprintselections_6',['ms3_printselections',['../group__data-selections.html#ga547f4d445c12e091bccca07de4135ccd',1,'ms3_printselections(const MS3Selections *selections): selection.c'],['../group__data-selections.html#ga547f4d445c12e091bccca07de4135ccd',1,'ms3_printselections(const MS3Selections *selections): selection.c']]], + ['ms3_5freadmsr_7',['ms3_readmsr',['../group__io-functions.html#gabb15ee422d81c42ed32bdeda94dfd87f',1,'ms3_readmsr(MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#gabb15ee422d81c42ed32bdeda94dfd87f',1,'ms3_readmsr(MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5freadmsr_5fr_8',['ms3_readmsr_r',['../group__io-functions.html#ga5b6440ce977797480d92b89d9c27b65e',1,'ms3_readmsr_r(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#ga5b6440ce977797480d92b89d9c27b65e',1,'ms3_readmsr_r(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5freadmsr_5fselection_9',['ms3_readmsr_selection',['../group__io-functions.html#gad8cfc654942a576ec6ec2e28d15ba9c8',1,'ms3_readmsr_selection(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, const MS3Selections *selections, int8_t verbose): fileutils.c'],['../group__io-functions.html#gad8cfc654942a576ec6ec2e28d15ba9c8',1,'ms3_readmsr_selection(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, const MS3Selections *selections, int8_t verbose): fileutils.c']]], + ['ms3_5freadselectionsfile_10',['ms3_readselectionsfile',['../group__data-selections.html#ga273a78998a8d5e515e54ac6e6f13c814',1,'ms3_readselectionsfile(MS3Selections **ppselections, const char *filename): selection.c'],['../group__data-selections.html#ga273a78998a8d5e515e54ac6e6f13c814',1,'ms3_readselectionsfile(MS3Selections **ppselections, const char *filename): selection.c']]], + ['ms3_5freadtracelist_11',['ms3_readtracelist',['../group__io-functions.html#ga1157d4e72e44fc250e36df8f073a9b68',1,'ms3_readtracelist(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#ga1157d4e72e44fc250e36df8f073a9b68',1,'ms3_readtracelist(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5freadtracelist_5fselection_12',['ms3_readtracelist_selection',['../group__io-functions.html#ga12803e139bd2dce6c1a7d03cbde8c384',1,'ms3_readtracelist_selection(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#ga12803e139bd2dce6c1a7d03cbde8c384',1,'ms3_readtracelist_selection(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5freadtracelist_5ftimewin_13',['ms3_readtracelist_timewin',['../group__io-functions.html#gabf2392422d3c3cee5bdf07d5ac1f953d',1,'ms3_readtracelist_timewin(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, nstime_t starttime, nstime_t endtime, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#gabf2392422d3c3cee5bdf07d5ac1f953d',1,'ms3_readtracelist_timewin(MS3TraceList **ppmstl, const char *mspath, const MS3Tolerance *tolerance, nstime_t starttime, nstime_t endtime, int8_t splitversion, uint32_t flags, int8_t verbose): fileutils.c']]], + ['ms3_5furl_5faddheader_14',['ms3_url_addheader',['../group__io-functions.html#ga7c518130509dfa8ccc5eada90d73d440',1,'ms3_url_addheader(const char *header): fileutils.c'],['../group__io-functions.html#ga7c518130509dfa8ccc5eada90d73d440',1,'ms3_url_addheader(const char *header): fileutils.c']]], + ['ms3_5furl_5ffreeheaders_15',['ms3_url_freeheaders',['../group__io-functions.html#ga2f0f529388948a9ff6445ad03dd91efd',1,'ms3_url_freeheaders(void): fileutils.c'],['../group__io-functions.html#ga2f0f529388948a9ff6445ad03dd91efd',1,'ms3_url_freeheaders(void): fileutils.c']]], + ['ms3_5furl_5fuseragent_16',['ms3_url_useragent',['../group__io-functions.html#gafcc98efb81d4f4adb24c9b07bd094e61',1,'ms3_url_useragent(const char *program, const char *version): fileutils.c'],['../group__io-functions.html#gafcc98efb81d4f4adb24c9b07bd094e61',1,'ms3_url_useragent(const char *program, const char *version): fileutils.c']]], + ['ms3_5furl_5fuserpassword_17',['ms3_url_userpassword',['../group__io-functions.html#gae4dcc9f830ddb1a8cdfd69c06b6cbe21',1,'ms3_url_userpassword(const char *userpassword): fileutils.c'],['../group__io-functions.html#gae4dcc9f830ddb1a8cdfd69c06b6cbe21',1,'ms3_url_userpassword(const char *userpassword): fileutils.c']]], + ['ms_5fbigendianhost_18',['ms_bigendianhost',['../group__utility-functions.html#ga64d6ddf48ae61fbb60ad1bd7392b90a0',1,'ms_bigendianhost(void): genutils.c'],['../group__utility-functions.html#ga64d6ddf48ae61fbb60ad1bd7392b90a0',1,'ms_bigendianhost(void): genutils.c']]], + ['ms_5fcrc32c_19',['ms_crc32c',['../group__utility-functions.html#ga21eb15aac0bb55fc5a3e0f45ceba4d60',1,'libmseed.h']]], + ['ms_5fdabs_20',['ms_dabs',['../group__utility-functions.html#gafb9328b80cda4b72ef76fdc77e1807f2',1,'ms_dabs(double val): genutils.c'],['../group__utility-functions.html#gafb9328b80cda4b72ef76fdc77e1807f2',1,'ms_dabs(double val): genutils.c']]], + ['ms_5fdecode_5fdata_21',['ms_decode_data',['../group__miniseed-record.html#ga9b407f96d2998e4e6376947bb5025598',1,'ms_decode_data(const void *input, uint64_t inputsize, uint8_t encoding, uint64_t samplecount, void *output, uint64_t outputsize, char *sampletype, int8_t swapflag, const char *sid, int8_t verbose): unpack.c'],['../group__miniseed-record.html#ga9b407f96d2998e4e6376947bb5025598',1,'ms_decode_data(const void *input, uint64_t inputsize, uint8_t encoding, uint64_t samplecount, void *output, uint64_t outputsize, char *sampletype, int8_t swapflag, const char *sid, int8_t verbose): unpack.c']]], + ['ms_5fdoy2md_22',['ms_doy2md',['../group__time-related.html#gad742a6973b9b9b28d2045292e9a729d3',1,'ms_doy2md(int year, int yday, int *month, int *mday): genutils.c'],['../group__time-related.html#gad742a6973b9b9b28d2045292e9a729d3',1,'ms_doy2md(int year, int yday, int *month, int *mday): genutils.c']]], + ['ms_5fencoding_5fsizetype_23',['ms_encoding_sizetype',['../group__utility-functions.html#ga374946dd5ce740adeb04de57c75049a3',1,'ms_encoding_sizetype(uint8_t encoding, uint8_t *samplesize, char *sampletype): lookup.c'],['../group__utility-functions.html#ga374946dd5ce740adeb04de57c75049a3',1,'ms_encoding_sizetype(uint8_t encoding, uint8_t *samplesize, char *sampletype): lookup.c']]], + ['ms_5fencodingstr_24',['ms_encodingstr',['../group__utility-functions.html#gabff14e9193c56d5280daa1fbeca8ca11',1,'ms_encodingstr(uint8_t encoding): lookup.c'],['../group__utility-functions.html#gabff14e9193c56d5280daa1fbeca8ca11',1,'ms_encodingstr(uint8_t encoding): lookup.c']]], + ['ms_5ferrorstr_25',['ms_errorstr',['../group__utility-functions.html#gac7d8c8a631b2d333da3246610b75f079',1,'ms_errorstr(int errorcode): lookup.c'],['../group__utility-functions.html#gac7d8c8a631b2d333da3246610b75f079',1,'ms_errorstr(int errorcode): lookup.c']]], + ['ms_5fmd2doy_26',['ms_md2doy',['../group__time-related.html#ga560a91cac2f0d1432d81bbeab3c9d55f',1,'ms_md2doy(int year, int month, int mday, int *yday): genutils.c'],['../group__time-related.html#ga560a91cac2f0d1432d81bbeab3c9d55f',1,'ms_md2doy(int year, int month, int mday, int *yday): genutils.c']]], + ['ms_5fmdtimestr2nstime_27',['ms_mdtimestr2nstime',['../group__time-related.html#ga5893363cccc0c798fdf3b93c229c30c6',1,'ms_mdtimestr2nstime(const char *timestr): genutils.c'],['../group__time-related.html#ga5893363cccc0c798fdf3b93c229c30c6',1,'ms_mdtimestr2nstime(const char *timestr): genutils.c']]], + ['ms_5fnslc2sid_28',['ms_nslc2sid',['../group__string-functions.html#gafdad1344eed8e551f2e5f44aee6c43dc',1,'ms_nslc2sid(char *sid, int sidlen, uint16_t flags, const char *net, const char *sta, const char *loc, const char *chan): genutils.c'],['../group__string-functions.html#gafdad1344eed8e551f2e5f44aee6c43dc',1,'ms_nslc2sid(char *sid, int sidlen, uint16_t flags, const char *net, const char *sta, const char *loc, const char *chan): genutils.c']]], + ['ms_5fnstime2time_29',['ms_nstime2time',['../group__time-related.html#ga10f96fdc3922538accae65828ffb7fef',1,'ms_nstime2time(nstime_t nstime, uint16_t *year, uint16_t *yday, uint8_t *hour, uint8_t *min, uint8_t *sec, uint32_t *nsec): genutils.c'],['../group__time-related.html#ga10f96fdc3922538accae65828ffb7fef',1,'ms_nstime2time(nstime_t nstime, uint16_t *year, uint16_t *yday, uint8_t *hour, uint8_t *min, uint8_t *sec, uint32_t *nsec): genutils.c']]], + ['ms_5fnstime2timestr_30',['ms_nstime2timestr',['../group__time-related.html#gafc71e63c89345baaba450780d1066235',1,'ms_nstime2timestr(nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subsecond): genutils.c'],['../group__time-related.html#gafc71e63c89345baaba450780d1066235',1,'ms_nstime2timestr(nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subseconds): genutils.c']]], + ['ms_5fnstime2timestrz_31',['ms_nstime2timestrz',['../group__time-related.html#ga60f9507f876917e24bdb9df60c0464e9',1,'ms_nstime2timestrz(nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subsecond): genutils.c'],['../group__time-related.html#ga60f9507f876917e24bdb9df60c0464e9',1,'ms_nstime2timestrz(nstime_t nstime, char *timestr, ms_timeformat_t timeformat, ms_subseconds_t subseconds): genutils.c']]], + ['ms_5fparse_5fraw2_32',['ms_parse_raw2',['../group__miniseed-record.html#gada80130e27bcf21c659028a725d3d05c',1,'ms_parse_raw2(const char *record, int maxreclen, int8_t details, int8_t swapflag): parseutils.c'],['../group__miniseed-record.html#gada80130e27bcf21c659028a725d3d05c',1,'ms_parse_raw2(const char *record, int maxreclen, int8_t details, int8_t swapflag): parseutils.c']]], + ['ms_5fparse_5fraw3_33',['ms_parse_raw3',['../group__miniseed-record.html#ga90e46dc65a1b70c1e20f54400df1938e',1,'ms_parse_raw3(const char *record, int maxreclen, int8_t details): parseutils.c'],['../group__miniseed-record.html#ga90e46dc65a1b70c1e20f54400df1938e',1,'ms_parse_raw3(const char *record, int maxreclen, int8_t details): parseutils.c']]], + ['ms_5freadleapsecondfile_34',['ms_readleapsecondfile',['../group__leapsecond.html#ga5ccec2d754c60b7ec5688eaabd06c683',1,'ms_readleapsecondfile(const char *filename): genutils.c'],['../group__leapsecond.html#ga5ccec2d754c60b7ec5688eaabd06c683',1,'ms_readleapsecondfile(const char *filename): genutils.c']]], + ['ms_5freadleapseconds_35',['ms_readleapseconds',['../group__leapsecond.html#ga9e5cacc7edef71721637a13781e154dc',1,'ms_readleapseconds(const char *envvarname): genutils.c'],['../group__leapsecond.html#ga9e5cacc7edef71721637a13781e154dc',1,'ms_readleapseconds(const char *envvarname): genutils.c']]], + ['ms_5frlog_36',['ms_rlog',['../group__logging.html#ga7fe4149465b0df172d13f05740de027b',1,'ms_rlog(const char *function, int level, const char *format,...): logging.c'],['../group__logging.html#ga7fe4149465b0df172d13f05740de027b',1,'ms_rlog(const char *function, int level, const char *format,...): logging.c']]], + ['ms_5frlog_5femit_37',['ms_rlog_emit',['../group__logging.html#gaad1e7c2c3a4e65a313bf9009b3461378',1,'ms_rlog_emit(MSLogParam *logp, int count, int context): logging.c'],['../group__logging.html#gaad1e7c2c3a4e65a313bf9009b3461378',1,'ms_rlog_emit(MSLogParam *logp, int count, int context): logging.c']]], + ['ms_5frlog_5ffree_38',['ms_rlog_free',['../group__logging.html#ga6c740db65abf102cedaf2417454914b7',1,'ms_rlog_free(MSLogParam *logp): logging.c'],['../group__logging.html#ga6c740db65abf102cedaf2417454914b7',1,'ms_rlog_free(MSLogParam *logp): logging.c']]], + ['ms_5frlog_5fl_39',['ms_rlog_l',['../group__logging.html#ga0727916fa4de8277dcdcccae692ab509',1,'ms_rlog_l(MSLogParam *logp, const char *function, int level, const char *format,...): logging.c'],['../group__logging.html#ga0727916fa4de8277dcdcccae692ab509',1,'ms_rlog_l(MSLogParam *logp, const char *function, int level, const char *format,...): logging.c']]], + ['ms_5frloginit_40',['ms_rloginit',['../group__logging.html#ga6efb16d950205d060217beb66379390e',1,'ms_rloginit(void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages): logging.c'],['../group__logging.html#ga6efb16d950205d060217beb66379390e',1,'ms_rloginit(void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages): logging.c']]], + ['ms_5frloginit_5fl_41',['ms_rloginit_l',['../group__logging.html#ga0a30e2301bd40aab8501ab367927e51a',1,'ms_rloginit_l(MSLogParam *logp, void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages): logging.c'],['../group__logging.html#ga0a30e2301bd40aab8501ab367927e51a',1,'ms_rloginit_l(MSLogParam *logp, void(*log_print)(const char *), const char *logprefix, void(*diag_print)(const char *), const char *errprefix, int maxmessages): logging.c']]], + ['ms_5fsamplesize_42',['ms_samplesize',['../group__utility-functions.html#ga3bdd8ee8b678b87ae241157a70e7705d',1,'ms_samplesize(char sampletype): lookup.c'],['../group__utility-functions.html#ga3bdd8ee8b678b87ae241157a70e7705d',1,'ms_samplesize(char sampletype): lookup.c']]], + ['ms_5fsampletime_43',['ms_sampletime',['../group__utility-functions.html#ga729687c8db7037f623515aa1d18c5160',1,'ms_sampletime(nstime_t time, int64_t offset, double samprate): genutils.c'],['../group__utility-functions.html#ga729687c8db7037f623515aa1d18c5160',1,'ms_sampletime(nstime_t time, int64_t offset, double samprate): genutils.c']]], + ['ms_5fseedchan2xchan_44',['ms_seedchan2xchan',['../group__string-functions.html#gad89ccaaeeeca1418dbf879d46ae98994',1,'ms_seedchan2xchan(char *xchan, const char *seedchan): genutils.c'],['../group__string-functions.html#gad89ccaaeeeca1418dbf879d46ae98994',1,'ms_seedchan2xchan(char *xchan, const char *seedchan): genutils.c']]], + ['ms_5fseedtimestr2nstime_45',['ms_seedtimestr2nstime',['../group__time-related.html#ga830b52d87558eb5e4fd79e273c7c69d9',1,'ms_seedtimestr2nstime(const char *seedtimestr): genutils.c'],['../group__time-related.html#ga830b52d87558eb5e4fd79e273c7c69d9',1,'ms_seedtimestr2nstime(const char *seedtimestr): genutils.c']]], + ['ms_5fsid2nslc_46',['ms_sid2nslc',['../group__string-functions.html#ga9efc6e3a3ab30e143dd8ad099b66ae3e',1,'ms_sid2nslc(const char *sid, char *net, char *sta, char *loc, char *chan): genutils.c'],['../group__string-functions.html#ga9efc6e3a3ab30e143dd8ad099b66ae3e',1,'ms_sid2nslc(const char *sid, char *net, char *sta, char *loc, char *chan): genutils.c']]], + ['ms_5fstrncpclean_47',['ms_strncpclean',['../group__string-functions.html#gab58b8cec58353914c7e6cb0f7790ee9d',1,'ms_strncpclean(char *dest, const char *source, int length): genutils.c'],['../group__string-functions.html#gab58b8cec58353914c7e6cb0f7790ee9d',1,'ms_strncpclean(char *dest, const char *source, int length): genutils.c']]], + ['ms_5fstrncpcleantail_48',['ms_strncpcleantail',['../group__string-functions.html#gae2a55f7d4a6d8359524466c7a87f49b5',1,'ms_strncpcleantail(char *dest, const char *source, int length): genutils.c'],['../group__string-functions.html#gae2a55f7d4a6d8359524466c7a87f49b5',1,'ms_strncpcleantail(char *dest, const char *source, int length): genutils.c']]], + ['ms_5fstrncpopen_49',['ms_strncpopen',['../group__string-functions.html#ga7cd416b4e8f12205eef09baaa9aff2ff',1,'ms_strncpopen(char *dest, const char *source, int length): genutils.c'],['../group__string-functions.html#ga7cd416b4e8f12205eef09baaa9aff2ff',1,'ms_strncpopen(char *dest, const char *source, int length): genutils.c']]], + ['ms_5ftime2nstime_50',['ms_time2nstime',['../group__time-related.html#gaccd7c7b149cb4f969159b97c48e520f7',1,'ms_time2nstime(int year, int yday, int hour, int min, int sec, uint32_t nsec): genutils.c'],['../group__time-related.html#gaccd7c7b149cb4f969159b97c48e520f7',1,'ms_time2nstime(int year, int yday, int hour, int min, int sec, uint32_t nsec): genutils.c']]], + ['ms_5ftimestr2nstime_51',['ms_timestr2nstime',['../group__time-related.html#ga5970fa0256338e4964e25941eac6c01e',1,'ms_timestr2nstime(const char *timestr): genutils.c'],['../group__time-related.html#ga5970fa0256338e4964e25941eac6c01e',1,'ms_timestr2nstime(const char *timestr): genutils.c']]], + ['ms_5fxchan2seedchan_52',['ms_xchan2seedchan',['../group__string-functions.html#gabbc0c24e7c7211ae98de00dd3dd7c284',1,'ms_xchan2seedchan(char *seedchan, const char *xchan): genutils.c'],['../group__string-functions.html#gabbc0c24e7c7211ae98de00dd3dd7c284',1,'ms_xchan2seedchan(char *seedchan, const char *xchan): genutils.c']]], + ['mseh_5fadd_5fcalibration_5fr_53',['mseh_add_calibration_r',['../group__extra-headers.html#ga8598d230d89898ef98319782f9d78bcd',1,'mseh_add_calibration_r(MS3Record *msr, const char *ptr, MSEHCalibration *calibration, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga8598d230d89898ef98319782f9d78bcd',1,'mseh_add_calibration_r(MS3Record *msr, const char *ptr, MSEHCalibration *calibration, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fadd_5fevent_5fdetection_5fr_54',['mseh_add_event_detection_r',['../group__extra-headers.html#ga5d7bd17612bbcdbb90a919f053ea6d35',1,'mseh_add_event_detection_r(MS3Record *msr, const char *ptr, MSEHEventDetection *eventdetection, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga5d7bd17612bbcdbb90a919f053ea6d35',1,'mseh_add_event_detection_r(MS3Record *msr, const char *ptr, MSEHEventDetection *eventdetection, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fadd_5frecenter_5fr_55',['mseh_add_recenter_r',['../group__extra-headers.html#gae0b1b765bc8a8968324f937d501b97f0',1,'mseh_add_recenter_r(MS3Record *msr, const char *ptr, MSEHRecenter *recenter, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#gae0b1b765bc8a8968324f937d501b97f0',1,'mseh_add_recenter_r(MS3Record *msr, const char *ptr, MSEHRecenter *recenter, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fadd_5ftiming_5fexception_5fr_56',['mseh_add_timing_exception_r',['../group__extra-headers.html#ga2edc5a29c678ba8bf3519b8fefd70e37',1,'mseh_add_timing_exception_r(MS3Record *msr, const char *ptr, MSEHTimingException *exception, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga2edc5a29c678ba8bf3519b8fefd70e37',1,'mseh_add_timing_exception_r(MS3Record *msr, const char *ptr, MSEHTimingException *exception, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5ffree_5fparsestate_57',['mseh_free_parsestate',['../group__extra-headers.html#ga86ca0bded5d41831bb52bf50a59331b0',1,'mseh_free_parsestate(LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga86ca0bded5d41831bb52bf50a59331b0',1,'mseh_free_parsestate(LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fget_5fptr_5fr_58',['mseh_get_ptr_r',['../group__extra-headers.html#ga81053dd21e2ffcce0302d444f33e19ff',1,'mseh_get_ptr_r(const MS3Record *msr, const char *ptr, void *value, char type, uint32_t maxlength, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga81053dd21e2ffcce0302d444f33e19ff',1,'mseh_get_ptr_r(const MS3Record *msr, const char *ptr, void *value, char type, uint32_t maxlength, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fprint_59',['mseh_print',['../group__extra-headers.html#ga4d057eb665121b06a8b51e70776b3eb0',1,'mseh_print(const MS3Record *msr, int indent): extraheaders.c'],['../group__extra-headers.html#ga4d057eb665121b06a8b51e70776b3eb0',1,'mseh_print(const MS3Record *msr, int indent): extraheaders.c']]], + ['mseh_5freplace_60',['mseh_replace',['../group__extra-headers.html#gae1f9322d8a8a528c4b061e72d5c74509',1,'mseh_replace(MS3Record *msr, char *jsonstring): extraheaders.c'],['../group__extra-headers.html#gae1f9322d8a8a528c4b061e72d5c74509',1,'mseh_replace(MS3Record *msr, char *jsonstring): extraheaders.c']]], + ['mseh_5fserialize_61',['mseh_serialize',['../group__extra-headers.html#ga59663ef9985ab0b240b0f8d21ffc9c2d',1,'mseh_serialize(MS3Record *msr, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga59663ef9985ab0b240b0f8d21ffc9c2d',1,'mseh_serialize(MS3Record *msr, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['mseh_5fset_5fptr_5fr_62',['mseh_set_ptr_r',['../group__extra-headers.html#ga91f66b6ace79d28ca08bceae99fde067',1,'mseh_set_ptr_r(MS3Record *msr, const char *ptr, void *value, char type, LM_PARSED_JSON **parsestate): extraheaders.c'],['../group__extra-headers.html#ga91f66b6ace79d28ca08bceae99fde067',1,'mseh_set_ptr_r(MS3Record *msr, const char *ptr, void *value, char type, LM_PARSED_JSON **parsestate): extraheaders.c']]], + ['msr3_5fdata_5fbounds_63',['msr3_data_bounds',['../group__miniseed-record.html#gaf7485dd9cdd6d7afcc00217f27433c04',1,'msr3_data_bounds(const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize): unpack.c'],['../group__miniseed-record.html#gaf7485dd9cdd6d7afcc00217f27433c04',1,'msr3_data_bounds(const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize): unpack.c']]], + ['msr3_5fduplicate_64',['msr3_duplicate',['../group__miniseed-record.html#gac06160223d7a9c60cd0d5b6e769f9c32',1,'msr3_duplicate(const MS3Record *msr, int8_t datadup): msrutils.c'],['../group__miniseed-record.html#gac06160223d7a9c60cd0d5b6e769f9c32',1,'msr3_duplicate(const MS3Record *msr, int8_t datadup): msrutils.c']]], + ['msr3_5fendtime_65',['msr3_endtime',['../group__miniseed-record.html#gac4fffbd1b07e9bc04a04dcbd02e1d80d',1,'msr3_endtime(const MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#gac4fffbd1b07e9bc04a04dcbd02e1d80d',1,'msr3_endtime(const MS3Record *msr): msrutils.c']]], + ['msr3_5ffree_66',['msr3_free',['../group__miniseed-record.html#ga72e0d55e9200bbdda71d157cd8939d4e',1,'msr3_free(MS3Record **ppmsr): msrutils.c'],['../group__miniseed-record.html#ga72e0d55e9200bbdda71d157cd8939d4e',1,'msr3_free(MS3Record **ppmsr): msrutils.c']]], + ['msr3_5fhost_5flatency_67',['msr3_host_latency',['../group__miniseed-record.html#ga5d2746d2fc34c6238682cd72b63d1bf5',1,'msr3_host_latency(const MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#ga5d2746d2fc34c6238682cd72b63d1bf5',1,'msr3_host_latency(const MS3Record *msr): msrutils.c']]], + ['msr3_5finit_68',['msr3_init',['../group__miniseed-record.html#ga45b12b97428e86249ee371ca0fd61473',1,'msr3_init(MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#ga45b12b97428e86249ee371ca0fd61473',1,'msr3_init(MS3Record *msr): msrutils.c']]], + ['msr3_5fmatchselect_69',['msr3_matchselect',['../group__data-selections.html#gad7ea4a66a5026e3df93ce9c7f0f287f3',1,'msr3_matchselect(const MS3Selections *selections, const MS3Record *msr, const MS3SelectTime **ppselecttime): selection.c'],['../group__data-selections.html#gad7ea4a66a5026e3df93ce9c7f0f287f3',1,'msr3_matchselect(const MS3Selections *selections, const MS3Record *msr, const MS3SelectTime **ppselecttime): selection.c']]], + ['msr3_5fpack_70',['msr3_pack',['../group__miniseed-record.html#gaf8260a62b2fb6b312664dc054d818e43',1,'msr3_pack(const MS3Record *msr, void(*record_handler)(char *, int, void *), void *handlerdata, int64_t *packedsamples, uint32_t flags, int8_t verbose): pack.c'],['../group__miniseed-record.html#gaf8260a62b2fb6b312664dc054d818e43',1,'msr3_pack(const MS3Record *msr, void(*record_handler)(char *, int, void *), void *handlerdata, int64_t *packedsamples, uint32_t flags, int8_t verbose): pack.c']]], + ['msr3_5fpack_5fheader2_71',['msr3_pack_header2',['../group__miniseed-record.html#ga6b88319a7327b4684c852af1942fde8e',1,'msr3_pack_header2(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c'],['../group__miniseed-record.html#ga6b88319a7327b4684c852af1942fde8e',1,'msr3_pack_header2(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c']]], + ['msr3_5fpack_5fheader3_72',['msr3_pack_header3',['../group__miniseed-record.html#gae4c2f6c895035165dd21581c01c0abb4',1,'msr3_pack_header3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c'],['../group__miniseed-record.html#gae4c2f6c895035165dd21581c01c0abb4',1,'msr3_pack_header3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c']]], + ['msr3_5fparse_73',['msr3_parse',['../group__miniseed-record.html#gaa8ec8453b225512960e4a44fe2bca938',1,'msr3_parse(const char *record, uint64_t recbuflen, MS3Record **ppmsr, uint32_t flags, int8_t verbose): parseutils.c'],['../group__miniseed-record.html#gaa8ec8453b225512960e4a44fe2bca938',1,'msr3_parse(const char *record, uint64_t recbuflen, MS3Record **ppmsr, uint32_t flags, int8_t verbose): parseutils.c']]], + ['msr3_5fprint_74',['msr3_print',['../group__miniseed-record.html#ga44e8cc87ec2b036ae23d76350edba59b',1,'msr3_print(const MS3Record *msr, int8_t details): msrutils.c'],['../group__miniseed-record.html#ga44e8cc87ec2b036ae23d76350edba59b',1,'msr3_print(const MS3Record *msr, int8_t details): msrutils.c']]], + ['msr3_5frepack_5fmseed3_75',['msr3_repack_mseed3',['../group__miniseed-record.html#ga2bcbc4dab5da941a83dac8494f56d06b',1,'msr3_repack_mseed3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c'],['../group__miniseed-record.html#ga2bcbc4dab5da941a83dac8494f56d06b',1,'msr3_repack_mseed3(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose): pack.c']]], + ['msr3_5fresize_5fbuffer_76',['msr3_resize_buffer',['../group__miniseed-record.html#ga9671336c6a76c5df2ea9bb41ee1c2afc',1,'msr3_resize_buffer(MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#ga9671336c6a76c5df2ea9bb41ee1c2afc',1,'msr3_resize_buffer(MS3Record *msr): msrutils.c']]], + ['msr3_5fsampratehz_77',['msr3_sampratehz',['../group__miniseed-record.html#ga47ab9421c5081a17078909bc950b4d93',1,'msr3_sampratehz(const MS3Record *msr): msrutils.c'],['../group__miniseed-record.html#ga47ab9421c5081a17078909bc950b4d93',1,'msr3_sampratehz(const MS3Record *msr): msrutils.c']]], + ['msr3_5funpack_5fdata_78',['msr3_unpack_data',['../group__miniseed-record.html#ga4d9056f00de1252658d3f2c6562576ee',1,'msr3_unpack_data(MS3Record *msr, int8_t verbose): unpack.c'],['../group__miniseed-record.html#ga4d9056f00de1252658d3f2c6562576ee',1,'msr3_unpack_data(MS3Record *msr, int8_t verbose): unpack.c']]], + ['msr3_5fwritemseed_79',['msr3_writemseed',['../group__io-functions.html#gaf2d6e0ee8e0cdc39add72816ca56ce4c',1,'msr3_writemseed(MS3Record *msr, const char *mspath, int8_t overwrite, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#gaf2d6e0ee8e0cdc39add72816ca56ce4c',1,'msr3_writemseed(MS3Record *msr, const char *mspath, int8_t overwrite, uint32_t flags, int8_t verbose): fileutils.c']]], + ['mstl3_5faddmsr_5frecordptr_80',['mstl3_addmsr_recordptr',['../group__trace-list.html#gaeb2f26a676d1db8e1bffd208df6877d1',1,'mstl3_addmsr_recordptr(MS3TraceList *mstl, const MS3Record *msr, MS3RecordPtr **pprecptr, int8_t splitversion, int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance): tracelist.c'],['../group__trace-list.html#gaeb2f26a676d1db8e1bffd208df6877d1',1,'mstl3_addmsr_recordptr(MS3TraceList *mstl, const MS3Record *msr, MS3RecordPtr **pprecptr, int8_t splitversion, int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance): tracelist.c']]], + ['mstl3_5fconvertsamples_81',['mstl3_convertsamples',['../group__trace-list.html#gac1cbcdce4bf2acd1c9f536efed1b0b66',1,'mstl3_convertsamples(MS3TraceSeg *seg, char type, int8_t truncate): tracelist.c'],['../group__trace-list.html#gac1cbcdce4bf2acd1c9f536efed1b0b66',1,'mstl3_convertsamples(MS3TraceSeg *seg, char type, int8_t truncate): tracelist.c']]], + ['mstl3_5ffindid_82',['mstl3_findID',['../group__trace-list.html#gad9b8a46cc920a664c65faa6cfd28b27c',1,'mstl3_findID(MS3TraceList *mstl, const char *sid, uint8_t pubversion, MS3TraceID **prev): tracelist.c'],['../group__trace-list.html#gad9b8a46cc920a664c65faa6cfd28b27c',1,'mstl3_findID(MS3TraceList *mstl, const char *sid, uint8_t pubversion, MS3TraceID **prev): tracelist.c']]], + ['mstl3_5ffree_83',['mstl3_free',['../group__trace-list.html#ga2a436ab4eb7cd653e52e6760c2f51f20',1,'mstl3_free(MS3TraceList **ppmstl, int8_t freeprvtptr): tracelist.c'],['../group__trace-list.html#ga2a436ab4eb7cd653e52e6760c2f51f20',1,'mstl3_free(MS3TraceList **ppmstl, int8_t freeprvtptr): tracelist.c']]], + ['mstl3_5finit_84',['mstl3_init',['../group__trace-list.html#gac23dc184eac5bbfec546e1079ea4aed7',1,'mstl3_init(MS3TraceList *mstl): tracelist.c'],['../group__trace-list.html#gac23dc184eac5bbfec546e1079ea4aed7',1,'mstl3_init(MS3TraceList *mstl): tracelist.c']]], + ['mstl3_5fpack_85',['mstl3_pack',['../group__trace-list.html#ga28697b648a1390ae480fdcf75a478079',1,'mstl3_pack(MS3TraceList *mstl, void(*record_handler)(char *, int, void *), void *handlerdata, int reclen, int8_t encoding, int64_t *packedsamples, uint32_t flags, int8_t verbose, char *extra): tracelist.c'],['../group__trace-list.html#ga28697b648a1390ae480fdcf75a478079',1,'mstl3_pack(MS3TraceList *mstl, void(*record_handler)(char *, int, void *), void *handlerdata, int reclen, int8_t encoding, int64_t *packedsamples, uint32_t flags, int8_t verbose, char *extra): tracelist.c']]], + ['mstl3_5fprintgaplist_86',['mstl3_printgaplist',['../group__trace-list.html#ga53bcc4905d5181d82227429860c84acb',1,'mstl3_printgaplist(const MS3TraceList *mstl, ms_timeformat_t timeformat, double *mingap, double *maxgap): tracelist.c'],['../group__trace-list.html#ga53bcc4905d5181d82227429860c84acb',1,'mstl3_printgaplist(const MS3TraceList *mstl, ms_timeformat_t timeformat, double *mingap, double *maxgap): tracelist.c']]], + ['mstl3_5fprintsynclist_87',['mstl3_printsynclist',['../group__trace-list.html#ga1230e91bdd8d278ec16e0fb315cf03f2',1,'mstl3_printsynclist(const MS3TraceList *mstl, const char *dccid, ms_subseconds_t subseconds): tracelist.c'],['../group__trace-list.html#ga1230e91bdd8d278ec16e0fb315cf03f2',1,'mstl3_printsynclist(const MS3TraceList *mstl, const char *dccid, ms_subseconds_t subseconds): tracelist.c']]], + ['mstl3_5fprinttracelist_88',['mstl3_printtracelist',['../group__trace-list.html#ga22651f0c2129e2f804899264b0822549',1,'mstl3_printtracelist(const MS3TraceList *mstl, ms_timeformat_t timeformat, int8_t details, int8_t gaps, int8_t versions): tracelist.c'],['../group__trace-list.html#ga22651f0c2129e2f804899264b0822549',1,'mstl3_printtracelist(const MS3TraceList *mstl, ms_timeformat_t timeformat, int8_t details, int8_t gaps, int8_t versions): tracelist.c']]], + ['mstl3_5freadbuffer_89',['mstl3_readbuffer',['../group__trace-list.html#ga43440b2eb6cb7be2a09cd54a856de718',1,'mstl3_readbuffer(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, int8_t verbose): tracelist.c'],['../group__trace-list.html#ga43440b2eb6cb7be2a09cd54a856de718',1,'mstl3_readbuffer(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, int8_t verbose): tracelist.c']]], + ['mstl3_5freadbuffer_5fselection_90',['mstl3_readbuffer_selection',['../group__trace-list.html#ga93a56335318fd6f55f4783c2a87f5a7b',1,'mstl3_readbuffer_selection(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t verbose): tracelist.c'],['../group__trace-list.html#ga93a56335318fd6f55f4783c2a87f5a7b',1,'mstl3_readbuffer_selection(MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength, int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance, const MS3Selections *selections, int8_t verbose): tracelist.c']]], + ['mstl3_5fresize_5fbuffers_91',['mstl3_resize_buffers',['../group__trace-list.html#ga922cf4103228d208a80e2c2c7a5c97ee',1,'mstl3_resize_buffers(MS3TraceList *mstl): tracelist.c'],['../group__trace-list.html#ga922cf4103228d208a80e2c2c7a5c97ee',1,'mstl3_resize_buffers(MS3TraceList *mstl): tracelist.c']]], + ['mstl3_5funpack_5frecordlist_92',['mstl3_unpack_recordlist',['../group__trace-list.html#ga061e55ff1eac9da605f8bc2bebb70848',1,'mstl3_unpack_recordlist(MS3TraceID *id, MS3TraceSeg *seg, void *output, uint64_t outputsize, int8_t verbose): tracelist.c'],['../group__trace-list.html#ga061e55ff1eac9da605f8bc2bebb70848',1,'mstl3_unpack_recordlist(MS3TraceID *id, MS3TraceSeg *seg, void *output, uint64_t outputsize, int8_t verbose): tracelist.c']]], + ['mstl3_5fwritemseed_93',['mstl3_writemseed',['../group__io-functions.html#gaca13b52a989f8e86a1f2c96f0ad853ba',1,'mstl3_writemseed(MS3TraceList *mst, const char *mspath, int8_t overwrite, int maxreclen, int8_t encoding, uint32_t flags, int8_t verbose): fileutils.c'],['../group__io-functions.html#gaca13b52a989f8e86a1f2c96f0ad853ba',1,'mstl3_writemseed(MS3TraceList *mstl, const char *mspath, int8_t overwrite, int maxreclen, int8_t encoding, uint32_t flags, int8_t verbose): fileutils.c']]] +]; diff --git a/search/groups_0.js b/search/groups_0.js new file mode 100644 index 0000000..b27fcd5 --- /dev/null +++ b/search/groups_0.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['allocators_0',['Memory Allocators',['../group__memory-allocators.html',1,'']]], + ['and_20functions_1',['Time definitions and functions',['../group__time-related.html',1,'']]], + ['and_20url_20i_20o_2',['File and URL I/O',['../group__io-functions.html',1,'']]] +]; diff --git a/search/groups_1.js b/search/groups_1.js new file mode 100644 index 0000000..15c77cb --- /dev/null +++ b/search/groups_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['byte_20swap_20flags_0',['Byte swap flags',['../group__byte-swap-flags.html',1,'']]] +]; diff --git a/search/groups_2.js b/search/groups_2.js new file mode 100644 index 0000000..dff5186 --- /dev/null +++ b/search/groups_2.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['central_20logging_0',['Central Logging',['../group__logging.html',1,'']]], + ['codes_1',['Return codes',['../group__return-values.html',1,'']]], + ['control_20flags_2',['Control flags',['../group__control-flags.html',1,'']]] +]; diff --git a/search/groups_3.js b/search/groups_3.js new file mode 100644 index 0000000..1181412 --- /dev/null +++ b/search/groups_3.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['data_20encodings_0',['Data Encodings',['../group__encoding-values.html',1,'']]], + ['data_20selections_1',['Data Selections',['../group__data-selections.html',1,'']]], + ['definitions_2',['Low level definitions',['../group__low-level.html',1,'']]], + ['definitions_20and_20functions_3',['Time definitions and functions',['../group__time-related.html',1,'']]] +]; diff --git a/search/groups_4.js b/search/groups_4.js new file mode 100644 index 0000000..ae5781c --- /dev/null +++ b/search/groups_4.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['encodings_0',['Data Encodings',['../group__encoding-values.html',1,'']]], + ['extra_20headers_1',['Extra Headers',['../group__extra-headers.html',1,'']]] +]; diff --git a/search/groups_5.js b/search/groups_5.js new file mode 100644 index 0000000..1ac2321 --- /dev/null +++ b/search/groups_5.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['file_20and_20url_20i_20o_0',['File and URL I/O',['../group__io-functions.html',1,'']]], + ['flags_1',['flags',['../group__byte-swap-flags.html',1,'Byte swap flags'],['../group__control-flags.html',1,'Control flags']]], + ['functions_2',['General Utility Functions',['../group__utility-functions.html',1,'']]], + ['functions_3',['Time definitions and functions',['../group__time-related.html',1,'']]] +]; diff --git a/search/groups_6.js b/search/groups_6.js new file mode 100644 index 0000000..edfef9b --- /dev/null +++ b/search/groups_6.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['general_20utility_20functions_0',['General Utility Functions',['../group__utility-functions.html',1,'']]] +]; diff --git a/search/groups_7.js b/search/groups_7.js new file mode 100644 index 0000000..fe93c8d --- /dev/null +++ b/search/groups_7.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['handling_0',['Handling',['../group__leapsecond.html',1,'Leap Second Handling'],['../group__miniseed-record.html',1,'Record Handling']]], + ['headers_1',['Extra Headers',['../group__extra-headers.html',1,'']]] +]; diff --git a/search/groups_8.js b/search/groups_8.js new file mode 100644 index 0000000..2f88758 --- /dev/null +++ b/search/groups_8.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['i_20o_0',['File and URL I/O',['../group__io-functions.html',1,'']]], + ['identifiers_1',['Source Identifiers',['../group__string-functions.html',1,'']]] +]; diff --git a/search/groups_9.js b/search/groups_9.js new file mode 100644 index 0000000..98a5ce3 --- /dev/null +++ b/search/groups_9.js @@ -0,0 +1,8 @@ +var searchData= +[ + ['leap_20second_20handling_0',['Leap Second Handling',['../group__leapsecond.html',1,'']]], + ['level_20definitions_1',['Low level definitions',['../group__low-level.html',1,'']]], + ['list_2',['List',['../group__record-list.html',1,'Record List'],['../group__trace-list.html',1,'Trace List']]], + ['logging_3',['Central Logging',['../group__logging.html',1,'']]], + ['low_20level_20definitions_4',['Low level definitions',['../group__low-level.html',1,'']]] +]; diff --git a/search/groups_a.js b/search/groups_a.js new file mode 100644 index 0000000..4de4383 --- /dev/null +++ b/search/groups_a.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['memory_20allocators_0',['Memory Allocators',['../group__memory-allocators.html',1,'']]] +]; diff --git a/search/groups_b.js b/search/groups_b.js new file mode 100644 index 0000000..9905d44 --- /dev/null +++ b/search/groups_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['o_0',['File and URL I/O',['../group__io-functions.html',1,'']]] +]; diff --git a/search/groups_c.js b/search/groups_c.js new file mode 100644 index 0000000..bd6e36e --- /dev/null +++ b/search/groups_c.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['record_20handling_0',['Record Handling',['../group__miniseed-record.html',1,'']]], + ['record_20list_1',['Record List',['../group__record-list.html',1,'']]], + ['return_20codes_2',['Return codes',['../group__return-values.html',1,'']]] +]; diff --git a/search/groups_d.js b/search/groups_d.js new file mode 100644 index 0000000..ddf68d9 --- /dev/null +++ b/search/groups_d.js @@ -0,0 +1,7 @@ +var searchData= +[ + ['second_20handling_0',['Leap Second Handling',['../group__leapsecond.html',1,'']]], + ['selections_1',['Data Selections',['../group__data-selections.html',1,'']]], + ['source_20identifiers_2',['Source Identifiers',['../group__string-functions.html',1,'']]], + ['swap_20flags_3',['Byte swap flags',['../group__byte-swap-flags.html',1,'']]] +]; diff --git a/search/groups_e.js b/search/groups_e.js new file mode 100644 index 0000000..f0e8a63 --- /dev/null +++ b/search/groups_e.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['time_20definitions_20and_20functions_0',['Time definitions and functions',['../group__time-related.html',1,'']]], + ['trace_20list_1',['Trace List',['../group__trace-list.html',1,'']]] +]; diff --git a/search/groups_f.js b/search/groups_f.js new file mode 100644 index 0000000..9c9657c --- /dev/null +++ b/search/groups_f.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['url_20i_20o_0',['File and URL I/O',['../group__io-functions.html',1,'']]], + ['utility_20functions_1',['General Utility Functions',['../group__utility-functions.html',1,'']]] +]; diff --git a/search/mag.svg b/search/mag.svg new file mode 100644 index 0000000..ffb6cf0 --- /dev/null +++ b/search/mag.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/search/mag_d.svg b/search/mag_d.svg new file mode 100644 index 0000000..4122773 --- /dev/null +++ b/search/mag_d.svg @@ -0,0 +1,24 @@ + + + + + + + diff --git a/search/mag_sel.svg b/search/mag_sel.svg new file mode 100644 index 0000000..553dba8 --- /dev/null +++ b/search/mag_sel.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/search/mag_seld.svg b/search/mag_seld.svg new file mode 100644 index 0000000..c906f84 --- /dev/null +++ b/search/mag_seld.svg @@ -0,0 +1,31 @@ + + + + + + + + + diff --git a/search/pages_0.js b/search/pages_0.js new file mode 100644 index 0000000..c8505a3 --- /dev/null +++ b/search/pages_0.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['asked_20questions_0',['Frequency asked questions',['../page-faq.html',1,'']]] +]; diff --git a/search/pages_1.js b/search/pages_1.js new file mode 100644 index 0000000..2114119 --- /dev/null +++ b/search/pages_1.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['capabilities_0',['Capabilities',['../page-capabilities.html',1,'index']]] +]; diff --git a/search/pages_2.js b/search/pages_2.js new file mode 100644 index 0000000..c85779a --- /dev/null +++ b/search/pages_2.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['deprecated_20list_0',['Deprecated List',['../deprecated.html',1,'']]], + ['documentation_1',['libmseed Documentation',['../index.html',1,'']]] +]; diff --git a/search/pages_3.js b/search/pages_3.js new file mode 100644 index 0000000..80f3093 --- /dev/null +++ b/search/pages_3.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['earlier_20libmseed_20versions_0',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]], + ['examples_1',['Examples',['../page-examples.html',1,'']]] +]; diff --git a/search/pages_4.js b/search/pages_4.js new file mode 100644 index 0000000..0350d8e --- /dev/null +++ b/search/pages_4.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['for_20porting_20from_20earlier_20libmseed_20versions_0',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]], + ['frequency_20asked_20questions_1',['Frequency asked questions',['../page-faq.html',1,'']]], + ['from_20earlier_20libmseed_20versions_2',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]] +]; diff --git a/search/pages_5.js b/search/pages_5.js new file mode 100644 index 0000000..ca84dc2 --- /dev/null +++ b/search/pages_5.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['guide_20for_20porting_20from_20earlier_20libmseed_20versions_0',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]] +]; diff --git a/search/pages_6.js b/search/pages_6.js new file mode 100644 index 0000000..8efb601 --- /dev/null +++ b/search/pages_6.js @@ -0,0 +1,6 @@ +var searchData= +[ + ['libmseed_20documentation_0',['libmseed Documentation',['../index.html',1,'']]], + ['libmseed_20versions_1',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]], + ['list_2',['Deprecated List',['../deprecated.html',1,'']]] +]; diff --git a/search/pages_7.js b/search/pages_7.js new file mode 100644 index 0000000..ae08c5e --- /dev/null +++ b/search/pages_7.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['porting_20from_20earlier_20libmseed_20versions_0',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]] +]; diff --git a/search/pages_8.js b/search/pages_8.js new file mode 100644 index 0000000..95ad94c --- /dev/null +++ b/search/pages_8.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['questions_0',['Frequency asked questions',['../page-faq.html',1,'']]] +]; diff --git a/search/pages_9.js b/search/pages_9.js new file mode 100644 index 0000000..5cb0a21 --- /dev/null +++ b/search/pages_9.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['sample_20types_0',['Sample Types',['../sample-types.html',1,'']]] +]; diff --git a/search/pages_a.js b/search/pages_a.js new file mode 100644 index 0000000..9dd8e81 --- /dev/null +++ b/search/pages_a.js @@ -0,0 +1,5 @@ +var searchData= +[ + ['tutorial_0',['Tutorial',['../page-tutorial.html',1,'index']]], + ['types_1',['Sample Types',['../sample-types.html',1,'']]] +]; diff --git a/search/pages_b.js b/search/pages_b.js new file mode 100644 index 0000000..b7b6785 --- /dev/null +++ b/search/pages_b.js @@ -0,0 +1,4 @@ +var searchData= +[ + ['versions_0',['Guide for porting from earlier libmseed versions',['../porting-guide.html',1,'']]] +]; diff --git a/search/search.css b/search/search.css new file mode 100644 index 0000000..19f76f9 --- /dev/null +++ b/search/search.css @@ -0,0 +1,291 @@ +/*---------------- Search Box positioning */ + +#main-menu > li:last-child { + /* This
  • object is the parent of the search bar */ + display: flex; + justify-content: center; + align-items: center; + height: 36px; + margin-right: 1em; +} + +/*---------------- Search box styling */ + +.SRPage * { + font-weight: normal; + line-height: normal; +} + +dark-mode-toggle { + margin-left: 5px; + display: flex; + float: right; +} + +#MSearchBox { + display: inline-block; + white-space : nowrap; + background: var(--search-background-color); + border-radius: 0.65em; + box-shadow: var(--search-box-shadow); + z-index: 102; +} + +#MSearchBox .left { + display: inline-block; + vertical-align: middle; + height: 1.4em; +} + +#MSearchSelect { + display: inline-block; + vertical-align: middle; + width: 20px; + height: 19px; + background-image: var(--search-magnification-select-image); + margin: 0 0 0 0.3em; + padding: 0; +} + +#MSearchSelectExt { + display: inline-block; + vertical-align: middle; + width: 10px; + height: 19px; + background-image: var(--search-magnification-image); + margin: 0 0 0 0.5em; + padding: 0; +} + + +#MSearchField { + display: inline-block; + vertical-align: middle; + width: 7.5em; + height: 19px; + margin: 0 0.15em; + padding: 0; + line-height: 1em; + border:none; + color: var(--search-foreground-color); + outline: none; + font-family: var(--font-family-search); + -webkit-border-radius: 0px; + border-radius: 0px; + background: none; +} + +@media(hover: none) { + /* to avoid zooming on iOS */ + #MSearchField { + font-size: 16px; + } +} + +#MSearchBox .right { + display: inline-block; + vertical-align: middle; + width: 1.4em; + height: 1.4em; +} + +#MSearchClose { + display: none; + font-size: inherit; + background : none; + border: none; + margin: 0; + padding: 0; + outline: none; + +} + +#MSearchCloseImg { + padding: 0.3em; + margin: 0; +} + +.MSearchBoxActive #MSearchField { + color: var(--search-active-color); +} + + + +/*---------------- Search filter selection */ + +#MSearchSelectWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-filter-border-color); + background-color: var(--search-filter-background-color); + z-index: 10001; + padding-top: 4px; + padding-bottom: 4px; + -moz-border-radius: 4px; + -webkit-border-top-left-radius: 4px; + -webkit-border-top-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15); +} + +.SelectItem { + font: 8pt var(--font-family-search); + padding-left: 2px; + padding-right: 12px; + border: 0px; +} + +span.SelectionMark { + margin-right: 4px; + font-family: var(--font-family-monospace); + outline-style: none; + text-decoration: none; +} + +a.SelectItem { + display: block; + outline-style: none; + color: var(--search-filter-foreground-color); + text-decoration: none; + padding-left: 6px; + padding-right: 12px; +} + +a.SelectItem:focus, +a.SelectItem:active { + color: var(--search-filter-foreground-color); + outline-style: none; + text-decoration: none; +} + +a.SelectItem:hover { + color: var(--search-filter-highlight-text-color); + background-color: var(--search-filter-highlight-bg-color); + outline-style: none; + text-decoration: none; + cursor: pointer; + display: block; +} + +/*---------------- Search results window */ + +iframe#MSearchResults { + /*width: 60ex;*/ + height: 15em; +} + +#MSearchResultsWindow { + display: none; + position: absolute; + left: 0; top: 0; + border: 1px solid var(--search-results-border-color); + background-color: var(--search-results-background-color); + z-index:10000; + width: 300px; + height: 400px; + overflow: auto; +} + +/* ----------------------------------- */ + + +#SRIndex { + clear:both; +} + +.SREntry { + font-size: 10pt; + padding-left: 1ex; +} + +.SRPage .SREntry { + font-size: 8pt; + padding: 1px 5px; +} + +div.SRPage { + margin: 5px 2px; + background-color: var(--search-results-background-color); +} + +.SRChildren { + padding-left: 3ex; padding-bottom: .5em +} + +.SRPage .SRChildren { + display: none; +} + +.SRSymbol { + font-weight: bold; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + text-decoration: none; + outline: none; +} + +a.SRScope { + display: block; + color: var(--search-results-foreground-color); + font-family: var(--font-family-search); + font-size: 8pt; + text-decoration: none; + outline: none; +} + +a.SRSymbol:focus, a.SRSymbol:active, +a.SRScope:focus, a.SRScope:active { + text-decoration: underline; +} + +span.SRScope { + padding-left: 4px; + font-family: var(--font-family-search); +} + +.SRPage .SRStatus { + padding: 2px 5px; + font-size: 8pt; + font-style: italic; + font-family: var(--font-family-search); +} + +.SRResult { + display: none; +} + +div.searchresults { + margin-left: 10px; + margin-right: 10px; +} + +/*---------------- External search page results */ + +.pages b { + color: white; + padding: 5px 5px 3px 5px; + background-image: var(--nav-gradient-active-image-parent); + background-repeat: repeat-x; + text-shadow: 0 1px 1px #000000; +} + +.pages { + line-height: 17px; + margin-left: 4px; + text-decoration: none; +} + +.hl { + font-weight: bold; +} + +#searchresults { + margin-bottom: 20px; +} + +.searchpages { + margin-top: 10px; +} + diff --git a/search/search.js b/search/search.js new file mode 100644 index 0000000..666af01 --- /dev/null +++ b/search/search.js @@ -0,0 +1,694 @@ +/* + @licstart The following is the entire license notice for the JavaScript code in this file. + + The MIT License (MIT) + + Copyright (C) 1997-2020 by Dimitri van Heesch + + Permission is hereby granted, free of charge, to any person obtaining a copy of this software + and associated documentation files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, publish, distribute, + sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all copies or + substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING + BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + @licend The above is the entire license notice for the JavaScript code in this file + */ +const SEARCH_COOKIE_NAME = ''+'search_grp'; + +const searchResults = new SearchResults(); + +/* A class handling everything associated with the search panel. + + Parameters: + name - The name of the global variable that will be + storing this instance. Is needed to be able to set timeouts. + resultPath - path to use for external files +*/ +function SearchBox(name, resultsPath, extension) { + if (!name || !resultsPath) { alert("Missing parameters to SearchBox."); } + if (!extension || extension == "") { extension = ".html"; } + + function getXPos(item) { + let x = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + x += item.offsetLeft; + item = item.offsetParent; + } + } + return x; + } + + function getYPos(item) { + let y = 0; + if (item.offsetWidth) { + while (item && item!=document.body) { + y += item.offsetTop; + item = item.offsetParent; + } + } + return y; + } + + // ---------- Instance variables + this.name = name; + this.resultsPath = resultsPath; + this.keyTimeout = 0; + this.keyTimeoutLength = 500; + this.closeSelectionTimeout = 300; + this.lastSearchValue = ""; + this.lastResultsPage = ""; + this.hideTimeout = 0; + this.searchIndex = 0; + this.searchActive = false; + this.extension = extension; + + // ----------- DOM Elements + + this.DOMSearchField = () => document.getElementById("MSearchField"); + this.DOMSearchSelect = () => document.getElementById("MSearchSelect"); + this.DOMSearchSelectWindow = () => document.getElementById("MSearchSelectWindow"); + this.DOMPopupSearchResults = () => document.getElementById("MSearchResults"); + this.DOMPopupSearchResultsWindow = () => document.getElementById("MSearchResultsWindow"); + this.DOMSearchClose = () => document.getElementById("MSearchClose"); + this.DOMSearchBox = () => document.getElementById("MSearchBox"); + + // ------------ Event Handlers + + // Called when focus is added or removed from the search field. + this.OnSearchFieldFocus = function(isActive) { + this.Activate(isActive); + } + + this.OnSearchSelectShow = function() { + const searchSelectWindow = this.DOMSearchSelectWindow(); + const searchField = this.DOMSearchSelect(); + + const left = getXPos(searchField); + const top = getYPos(searchField) + searchField.offsetHeight; + + // show search selection popup + searchSelectWindow.style.display='block'; + searchSelectWindow.style.left = left + 'px'; + searchSelectWindow.style.top = top + 'px'; + + // stop selection hide timer + if (this.hideTimeout) { + clearTimeout(this.hideTimeout); + this.hideTimeout=0; + } + return false; // to avoid "image drag" default event + } + + this.OnSearchSelectHide = function() { + this.hideTimeout = setTimeout(this.CloseSelectionWindow.bind(this), + this.closeSelectionTimeout); + } + + // Called when the content of the search field is changed. + this.OnSearchFieldChange = function(evt) { + if (this.keyTimeout) { // kill running timer + clearTimeout(this.keyTimeout); + this.keyTimeout = 0; + } + + const e = evt ? evt : window.event; // for IE + if (e.keyCode==40 || e.keyCode==13) { + if (e.shiftKey==1) { + this.OnSearchSelectShow(); + const win=this.DOMSearchSelectWindow(); + for (let i=0;i do a search + this.Search(); + } + } + + this.OnSearchSelectKey = function(evt) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==40 && this.searchIndex0) { // Up + this.searchIndex--; + this.OnSelectItem(this.searchIndex); + } else if (e.keyCode==13 || e.keyCode==27) { + e.stopPropagation(); + this.OnSelectItem(this.searchIndex); + this.CloseSelectionWindow(); + this.DOMSearchField().focus(); + } + return false; + } + + // --------- Actions + + // Closes the results window. + this.CloseResultsWindow = function() { + this.DOMPopupSearchResultsWindow().style.display = 'none'; + this.DOMSearchClose().style.display = 'none'; + this.Activate(false); + } + + this.CloseSelectionWindow = function() { + this.DOMSearchSelectWindow().style.display = 'none'; + } + + // Performs a search. + this.Search = function() { + this.keyTimeout = 0; + + // strip leading whitespace + const searchValue = this.DOMSearchField().value.replace(/^ +/, ""); + + const code = searchValue.toLowerCase().charCodeAt(0); + let idxChar = searchValue.substr(0, 1).toLowerCase(); + if ( 0xD800 <= code && code <= 0xDBFF && searchValue > 1) { // surrogate pair + idxChar = searchValue.substr(0, 2); + } + + let jsFile; + let idx = indexSectionsWithContent[this.searchIndex].indexOf(idxChar); + if (idx!=-1) { + const hexCode=idx.toString(16); + jsFile = this.resultsPath + indexSectionNames[this.searchIndex] + '_' + hexCode + '.js'; + } + + const loadJS = function(url, impl, loc) { + const scriptTag = document.createElement('script'); + scriptTag.src = url; + scriptTag.onload = impl; + scriptTag.onreadystatechange = impl; + loc.appendChild(scriptTag); + } + + const domPopupSearchResultsWindow = this.DOMPopupSearchResultsWindow(); + const domSearchBox = this.DOMSearchBox(); + const domPopupSearchResults = this.DOMPopupSearchResults(); + const domSearchClose = this.DOMSearchClose(); + const resultsPath = this.resultsPath; + + const handleResults = function() { + document.getElementById("Loading").style.display="none"; + if (typeof searchData !== 'undefined') { + createResults(resultsPath); + document.getElementById("NoMatches").style.display="none"; + } + + if (idx!=-1) { + searchResults.Search(searchValue); + } else { // no file with search results => force empty search results + searchResults.Search('===='); + } + + if (domPopupSearchResultsWindow.style.display!='block') { + domSearchClose.style.display = 'inline-block'; + let left = getXPos(domSearchBox) + 150; + let top = getYPos(domSearchBox) + 20; + domPopupSearchResultsWindow.style.display = 'block'; + left -= domPopupSearchResults.offsetWidth; + const maxWidth = document.body.clientWidth; + const maxHeight = document.body.clientHeight; + let width = 300; + if (left<10) left=10; + if (width+left+8>maxWidth) width=maxWidth-left-8; + let height = 400; + if (height+top+8>maxHeight) height=maxHeight-top-8; + domPopupSearchResultsWindow.style.top = top + 'px'; + domPopupSearchResultsWindow.style.left = left + 'px'; + domPopupSearchResultsWindow.style.width = width + 'px'; + domPopupSearchResultsWindow.style.height = height + 'px'; + } + } + + if (jsFile) { + loadJS(jsFile, handleResults, this.DOMPopupSearchResultsWindow()); + } else { + handleResults(); + } + + this.lastSearchValue = searchValue; + } + + // -------- Activation Functions + + // Activates or deactivates the search panel, resetting things to + // their default values if necessary. + this.Activate = function(isActive) { + if (isActive || // open it + this.DOMPopupSearchResultsWindow().style.display == 'block' + ) { + this.DOMSearchBox().className = 'MSearchBoxActive'; + this.searchActive = true; + } else if (!isActive) { // directly remove the panel + this.DOMSearchBox().className = 'MSearchBoxInactive'; + this.searchActive = false; + this.lastSearchValue = '' + this.lastResultsPage = ''; + this.DOMSearchField().value = ''; + } + } +} + +// ----------------------------------------------------------------------- + +// The class that handles everything on the search results page. +function SearchResults() { + + function convertToId(search) { + let result = ''; + for (let i=0;i. + this.lastMatchCount = 0; + this.lastKey = 0; + this.repeatOn = false; + + // Toggles the visibility of the passed element ID. + this.FindChildElement = function(id) { + const parentElement = document.getElementById(id); + let element = parentElement.firstChild; + + while (element && element!=parentElement) { + if (element.nodeName.toLowerCase() == 'div' && element.className == 'SRChildren') { + return element; + } + + if (element.nodeName.toLowerCase() == 'div' && element.hasChildNodes()) { + element = element.firstChild; + } else if (element.nextSibling) { + element = element.nextSibling; + } else { + do { + element = element.parentNode; + } + while (element && element!=parentElement && !element.nextSibling); + + if (element && element!=parentElement) { + element = element.nextSibling; + } + } + } + } + + this.Toggle = function(id) { + const element = this.FindChildElement(id); + if (element) { + if (element.style.display == 'block') { + element.style.display = 'none'; + } else { + element.style.display = 'block'; + } + } + } + + // Searches for the passed string. If there is no parameter, + // it takes it from the URL query. + // + // Always returns true, since other documents may try to call it + // and that may or may not be possible. + this.Search = function(search) { + if (!search) { // get search word from URL + search = window.location.search; + search = search.substring(1); // Remove the leading '?' + search = unescape(search); + } + + search = search.replace(/^ +/, ""); // strip leading spaces + search = search.replace(/ +$/, ""); // strip trailing spaces + search = search.toLowerCase(); + search = convertToId(search); + + const resultRows = document.getElementsByTagName("div"); + let matches = 0; + + let i = 0; + while (i < resultRows.length) { + const row = resultRows.item(i); + if (row.className == "SRResult") { + let rowMatchName = row.id.toLowerCase(); + rowMatchName = rowMatchName.replace(/^sr\d*_/, ''); // strip 'sr123_' + + if (search.length<=rowMatchName.length && + rowMatchName.substr(0, search.length)==search) { + row.style.display = 'block'; + matches++; + } else { + row.style.display = 'none'; + } + } + i++; + } + document.getElementById("Searching").style.display='none'; + if (matches == 0) { // no results + document.getElementById("NoMatches").style.display='block'; + } else { // at least one result + document.getElementById("NoMatches").style.display='none'; + } + this.lastMatchCount = matches; + return true; + } + + // return the first item with index index or higher that is visible + this.NavNext = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index++; + } + return focusItem; + } + + this.NavPrev = function(index) { + let focusItem; + for (;;) { + const focusName = 'Item'+index; + focusItem = document.getElementById(focusName); + if (focusItem && focusItem.parentNode.parentNode.style.display=='block') { + break; + } else if (!focusItem) { // last element + break; + } + focusItem=null; + index--; + } + return focusItem; + } + + this.ProcessKeys = function(e) { + if (e.type == "keydown") { + this.repeatOn = false; + this.lastKey = e.keyCode; + } else if (e.type == "keypress") { + if (!this.repeatOn) { + if (this.lastKey) this.repeatOn = true; + return false; // ignore first keypress after keydown + } + } else if (e.type == "keyup") { + this.lastKey = 0; + this.repeatOn = false; + } + return this.lastKey!=0; + } + + this.Nav = function(evt,itemIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + const newIndex = itemIndex-1; + let focusItem = this.NavPrev(newIndex); + if (focusItem) { + let child = this.FindChildElement(focusItem.parentNode.parentNode.id); + if (child && child.style.display == 'block') { // children visible + let n=0; + let tmpElem; + for (;;) { // search for last child + tmpElem = document.getElementById('Item'+newIndex+'_c'+n); + if (tmpElem) { + focusItem = tmpElem; + } else { // found it! + break; + } + n++; + } + } + } + if (focusItem) { + focusItem.focus(); + } else { // return focus to search field + document.getElementById("MSearchField").focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = itemIndex+1; + let focusItem; + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem && elem.style.display == 'block') { // children visible + focusItem = document.getElementById('Item'+itemIndex+'_c0'); + } + if (!focusItem) focusItem = this.NavNext(newIndex); + if (focusItem) focusItem.focus(); + } else if (this.lastKey==39) { // Right + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'block'; + } else if (this.lastKey==37) { // Left + const item = document.getElementById('Item'+itemIndex); + const elem = this.FindChildElement(item.parentNode.parentNode.id); + if (elem) elem.style.display = 'none'; + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } + + this.NavChild = function(evt,itemIndex,childIndex) { + const e = (evt) ? evt : window.event; // for IE + if (e.keyCode==13) return true; + if (!this.ProcessKeys(e)) return false; + + if (this.lastKey==38) { // Up + if (childIndex>0) { + const newIndex = childIndex-1; + document.getElementById('Item'+itemIndex+'_c'+newIndex).focus(); + } else { // already at first child, jump to parent + document.getElementById('Item'+itemIndex).focus(); + } + } else if (this.lastKey==40) { // Down + const newIndex = childIndex+1; + let elem = document.getElementById('Item'+itemIndex+'_c'+newIndex); + if (!elem) { // last child, jump to parent next parent + elem = this.NavNext(itemIndex+1); + } + if (elem) { + elem.focus(); + } + } else if (this.lastKey==27) { // Escape + e.stopPropagation(); + searchBox.CloseResultsWindow(); + document.getElementById("MSearchField").focus(); + } else if (this.lastKey==13) { // Enter + return true; + } + return false; + } +} + +function createResults(resultsPath) { + + function setKeyActions(elem,action) { + elem.setAttribute('onkeydown',action); + elem.setAttribute('onkeypress',action); + elem.setAttribute('onkeyup',action); + } + + function setClassAttr(elem,attr) { + elem.setAttribute('class',attr); + elem.setAttribute('className',attr); + } + + const results = document.getElementById("SRResults"); + results.innerHTML = ''; + searchData.forEach((elem,index) => { + const id = elem[0]; + const srResult = document.createElement('div'); + srResult.setAttribute('id','SR_'+id); + setClassAttr(srResult,'SRResult'); + const srEntry = document.createElement('div'); + setClassAttr(srEntry,'SREntry'); + const srLink = document.createElement('a'); + srLink.setAttribute('id','Item'+index); + setKeyActions(srLink,'return searchResults.Nav(event,'+index+')'); + setClassAttr(srLink,'SRSymbol'); + srLink.innerHTML = elem[1][0]; + srEntry.appendChild(srLink); + if (elem[1].length==2) { // single result + srLink.setAttribute('href',resultsPath+elem[1][1][0]); + srLink.setAttribute('onclick','searchBox.CloseResultsWindow()'); + if (elem[1][1][1]) { + srLink.setAttribute('target','_parent'); + } else { + srLink.setAttribute('target','_blank'); + } + const srScope = document.createElement('span'); + setClassAttr(srScope,'SRScope'); + srScope.innerHTML = elem[1][1][2]; + srEntry.appendChild(srScope); + } else { // multiple results + srLink.setAttribute('href','javascript:searchResults.Toggle("SR_'+id+'")'); + const srChildren = document.createElement('div'); + setClassAttr(srChildren,'SRChildren'); + for (let c=0; c-{AmhX=Jf(#6d%$_ceAr*{o?=JLfN|bT? z_&ITr(Q{b`Wsid5%P9*jCMz45cg^lR)ONJ3)j_#{`@pehdst40%)ZxH95(yM&d7O5 zi|4-G++#p zkA7{sw=+xT+N#Ixo0BY}_}@iMzPatH&8>ZV-v7U@U;Do7>ACrFr}x(1sW9Q}P$3;H csei$~S;THu-OGOpz))fEboFyt=akR{0H|Di*Z=?k literal 0 HcmV?d00001 diff --git a/splitbard.png b/splitbard.png new file mode 100644 index 0000000000000000000000000000000000000000..db21985141e88d2d6177c11c083a33a011ea8151 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^Yzz!63>-{AmhX=Jf@VhhFKy35^fib zJ3W^blxRsex0W$#vqnc-A3S!+>rO{^;q<-*54JOG+}Z#8-=hz@kAA(YsH^z=^vjoj z&%S-U`gL*hVbM4JN + + + + + + +libmseed: LIBMSEED_MEMORY Struct Reference + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    LIBMSEED_MEMORY Struct Reference
    +
    +
    + +

    #include <libmseed.h>

    + + + + + + + + + + + +

    +Data Fields

    +void *(* malloc )(size_t)
     Pointer to desired malloc()
     
    +void *(* realloc )(void *, size_t)
     Pointer to desired realloc()
     
    +void(* free )(void *)
     Pointer to desired free()
     
    +

    Detailed Description

    +

    Container for memory management function pointers

    +
    + + + + + diff --git a/struct_l_m_i_o.html b/struct_l_m_i_o.html new file mode 100644 index 0000000..fb5377e --- /dev/null +++ b/struct_l_m_i_o.html @@ -0,0 +1,150 @@ + + + + + + + +libmseed: LMIO Struct Reference + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    LMIO Struct Reference
    +
    +
    + +

    Type definition for data source I/O: file-system versus URL. + More...

    + +

    #include <libmseed.h>

    + + + + +

    +Public Types

    enum  { LMIO_NULL = 0 +, LMIO_FILE = 1 +, LMIO_URL = 2 +, LMIO_FD = 3 + }
     
    + + + + + + + + + + + + + +

    +Data Fields

    +enum LMIO:: { ... }  type
     IO handle type.
     
    +void * handle
     Primary IO handle, either file or URL.
     
    +void * handle2
     Secondary IO handle for URL.
     
    +int still_running
     Fetch status flag for URL transmissions.
     
    +

    Detailed Description

    +

    Type definition for data source I/O: file-system versus URL.

    +

    Member Enumeration Documentation

    + +

    ◆ anonymous enum

    + +
    +
    + + + + +
    anonymous enum
    +
    + + + + + +
    Enumerator
    LMIO_NULL 

    IO handle type is undefined.

    +
    LMIO_FILE 

    IO handle is FILE-type.

    +
    LMIO_URL 

    IO handle is URL-type.

    +
    LMIO_FD 

    IO handle is a provided file descriptor.

    +
    + +
    +
    +
    + + + + + diff --git a/struct_m_s3_tolerance.html b/struct_m_s3_tolerance.html new file mode 100644 index 0000000..36a25f6 --- /dev/null +++ b/struct_m_s3_tolerance.html @@ -0,0 +1,122 @@ + + + + + + + +libmseed: MS3Tolerance Struct Reference + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    MS3Tolerance Struct Reference
    +
    +
    + +

    Callback functions that return time and sample rate tolerances. + More...

    + +

    #include <libmseed.h>

    + + + + + + + + +

    +Data Fields

    +double(* time )(const MS3Record *msr)
     Pointer to function that returns time tolerance.
     
    +double(* samprate )(const MS3Record *msr)
     Pointer to function that returns sample rate tolerance.
     
    +

    Detailed Description

    +

    Callback functions that return time and sample rate tolerances.

    +

    A container for function pointers that return time and sample rate tolerances that are used for merging data into MS3TraceList containers. The functions are provided with a MS3Record and must return the acceptable tolerances to merge this with other data.

    +

    The time(MS3Record) function must return a time tolerance in seconds.

    +

    The samprate(MS3Record) function must return a sampling rate tolerance in Hertz.

    +

    For any function pointer set to NULL a default tolerance will be used.

    +

    Illustrated usage:

    MS3Tolerance tolerance;
    +
    +
    tolerance.time = my_time_tolerance_function;
    +
    tolerance.samprate = my_samprate_tolerance_function;
    +
    +
    mstl3_addmsr (mstl, msr, 0, 1, &tolerance);
    +
    #define mstl3_addmsr(mstl, msr, splitversion, autoheal, flags, tolerance)
    Add a MS3Record to a MS3TraceList.
    Definition libmseed.h:628
    +
    Callback functions that return time and sample rate tolerances.
    Definition libmseed.h:610
    +
    double(* samprate)(const MS3Record *msr)
    Pointer to function that returns sample rate tolerance.
    Definition libmseed.h:612
    +
    double(* time)(const MS3Record *msr)
    Pointer to function that returns time tolerance.
    Definition libmseed.h:611
    +
    See also
    mstl3_addmsr()
    +
    + + + + + diff --git a/struct_m_s_log_param.html b/struct_m_s_log_param.html new file mode 100644 index 0000000..a25ced5 --- /dev/null +++ b/struct_m_s_log_param.html @@ -0,0 +1,120 @@ + + + + + + + +libmseed: MSLogParam Struct Reference + + + + + + + + + + + + +
    +
    + + + + + + +
    +
    libmseed 3.1.1 +
    +
    The miniSEED data format library
    +
    +
    + + + + + + + + +
    +
    + + +
    +
    +
    +
    +
    +
    Loading...
    +
    Searching...
    +
    No Matches
    +
    +
    +
    +
    + +
    +
    + +
    MSLogParam Struct Reference
    +
    +
    + +

    Logging parameters. Callers should not modify these values directly and generally should not need to access them. + More...

    + +

    #include <libmseed.h>

    + + + + + + + + + + + + + + + + + +

    +Data Fields

    +void(* log_print )(const char *)
     Function to call for regular messages.
     
    +const char * logprefix
     Message prefix for regular and diagnostic messages.
     
    +void(* diag_print )(const char *)
     Function to call for diagnostic and error messages.
     
    +const char * errprefix
     Message prefix for error messages.
     
    +MSLogRegistry registry
     Message registry.
     
    +

    Detailed Description

    +

    Logging parameters. Callers should not modify these values directly and generally should not need to access them.

    +
    See also
    ms_loginit()
    +
    + + + + + diff --git a/sync_off.png b/sync_off.png new file mode 100644 index 0000000000000000000000000000000000000000..b6c473db4489dd969d45da5172e4a62150606c66 GIT binary patch literal 861 zcmV-j1ETziP)tRvbx{V1xKN#jF6H)+b`GdEw11 z++t?eJC6d)0KM4`(Pz%!1Cb5j6bL>G;L7U@0JxbWKGv5=6J&}Sz!rvKaIp53(T!#K z0IqTtK2QC@a(w;}fYWwSs0k{aOA`o2ICi*_ZJY8u_a6)cxauEx$Q$L0Xl;ItNOS>! zQ53oh0CRk}+6|X7c%*j{D$x5z!d1)3^ zJBq2+5rXWcYj@-h1aI8sDw>$9&kDz|gad`C))5H8lM&KDcEj08VMq z-~($dx+#AP^kVC#Rn*nK03_q?pZ{|2uR%N>Baz^A(-uZYAMwnbSrja`Z=G`;xA>~P zGx2jx@V%VuGCx_qbO|3GT1_+(9N(6o|G|ZeR{_b zu4`G)bcqBvx_da#*iX}uHN^7L2nMt|156eQj#m|(WpnGV^!D}ww&>Iu=<;+4+e7fr znoUDpDcv{wIRDe{0F&hBZ88!H zdVswsif}LMMS(9$m;<-5+!9|nVay?HNEQR1(#-AmyL!FnT+Ruz-X4A*?z!jO`~Ur) z|8I@D9p3^t35l(uMywZE!YxL`UGamsEd~MX7!C;4={hu;cT;2w>s%_yC-wh~qkmG(nEo4Uot%jJbW0H`uzl0Knqq zHLE$WuMUql8NkkaqC^wa+jWi4ALPg<^{yQa`8=GS1+W;Oc*NUvxtwZ!i(qOtfSo2y zPzzWh6bf_p>uqeV*2V!iD=kXrLff0HE6xW;^V!qQC6Hz`-PqdGt*;fI@sDpMsz_KQp;8GS_3RcTB;wH%QJ1>iw5Mg zDE44`!$z7TuLAKH{(Fp(dz13VXkD0_`;Qk=k|FVwSEOA%IpgS=^U;iK< z9UAA$mMV(#)9}k61C~hk&+jPOy4F)aF*Gy;kf>W*pxx7}lL4@VH)#b2n``MG80GrS zUx0WNq`!LrY7$L@$h;B(Y}8Ccm}{u zmmXHJ1Z%`^Vt!%+JR8lb3;5^QX7`t926#?B*TNG|w5vil72VGPmg|gYd(xR45$$3n zz*Er0^@X``^MPZ&bi(W5qf5QS=2!(t)VWYGT~k0j>{?*HUJ*NmuBgm~gG3XK>uDvv gUnn%%-vEjJ2Sxj>coP!M2><{907*qoM6N<$g0oqcxc~qF literal 0 HcmV?d00001 diff --git a/tab_a.png b/tab_a.png new file mode 100644 index 0000000000000000000000000000000000000000..238124f517f080930a6f0f52ae25c4364c101430 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QURVWjv*C{Z|6F4H5dpmPu2`O z(xjgM@BeJmur530lp87K`xlhO=xp8iR=qUW;iy^Ho2Dg-!5fU^d0zcJds%trBwLGb mYUkJeli@!Tz43i}Ewl19W=;0ZYIlHUGkCiCxvX9gctkKUh?e(m?@QQ14W cZPf?(O|CO+*!$Xj1JFbUPgg&ebxsLQ0KSnh0ssI2 literal 0 HcmV?d00001 diff --git a/tab_b.png b/tab_b.png new file mode 100644 index 0000000000000000000000000000000000000000..fcf800886b438f5f5780c219a36244bac50dcae7 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!Qk9-Ajv*C{Z}0l@H5rJoJh*P& z(W&#nZe7gIiM`f8H%4sDT+Ak=aHpSF{G-CHw%+M8YG%%izF<;cF?*fm%{3pY`VG!A z-uhNCL+;f*$CrGcUMb}Bg}&YDs2KfZx|+pwUSUB#_p>@Izc(yc`rrIP;fojQeGlz7 eO+K2pexHV-M8G!N1XiFU7(8A5T-G@yGywqfJw{;w literal 0 HcmV?d00001 diff --git a/tab_bd.png b/tab_bd.png new file mode 100644 index 0000000000000000000000000000000000000000..efe6d47002e415b2ffb7badb89d981c5e9836c35 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QgNOxjv*C{Z|_EPwL0)HU)VBp z`eHt%7t4RgFD*{~|4vKFk85f6fjXOcr(gMS|1K+z)ZbR;mSwH9ly{odjMwjG1m}G! zO)z@;ZzaR8hiL)kne|RlZ{E!kaNGK&^qAxu_LrF)4u|f%S^%_(!PC{xWt~$(69D6e BI_LlZ literal 0 HcmV?d00001 diff --git a/tab_h.png b/tab_h.png new file mode 100644 index 0000000000000000000000000000000000000000..c614a6f3a8687e5e33df57b2ee7d48f0ca793847 GIT binary patch literal 186 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QjMN2jv*C{Z|53v9dZzH`9I%N z#N`V^Sku&qC^lZ{aB)>7F0-|yy~0%x7jSAOt*LU<~vo>wmrR7wN5GY@S;yTKFop-OX^q`1WZlgowTFrzpb)E m7SoHTADg?M_D;U}lwEnZ(DB)4qPc;NVeoYIb6Mw<&;$U!-Aif! literal 0 HcmV?d00001 diff --git a/tab_hd.png b/tab_hd.png new file mode 100644 index 0000000000000000000000000000000000000000..e9753752bca1a9a7debf9e028b6d479afb535092 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^j6kfy!2~3aiye;!QU#tajv*C{Z|6qyH8}{dr0~{(_K*MA4?5a-EZy~5R($n5wD#PjY T|I?2Mpxq3fu6{1-oD!M*gDNle36xv-Otr3)1=CXX#}yw`E@K;@sFwem#k2t!e*#_DU}$Tc@*81zFRUJF`YUD2L;jXNi z^tyTBJ;_hKc{`%gjn6NsQ!4GPnBeBLswLvXLi>Z|&tp3@7(@GmbM!3=JBp{B{`i^y YpevvMhArm$K>HayUHx3vIVCg!09CX`FaQ7m literal 0 HcmV?d00001 diff --git a/tabs.css b/tabs.css new file mode 100644 index 0000000..fe4854a --- /dev/null +++ b/tabs.css @@ -0,0 +1 @@ +.sm{position:relative;z-index:9999}.sm,.sm ul,.sm li{display:block;list-style:none;margin:0;padding:0;line-height:normal;direction:ltr;text-align:left;-webkit-tap-highlight-color:rgba(0,0,0,0)}.sm-rtl,.sm-rtl ul,.sm-rtl li{direction:rtl;text-align:right}.sm>li>h1,.sm>li>h2,.sm>li>h3,.sm>li>h4,.sm>li>h5,.sm>li>h6{margin:0;padding:0}.sm ul{display:none}.sm li,.sm a{position:relative}.sm a{display:block}.sm a.disabled{cursor:not-allowed}.sm:after{content:"\00a0";display:block;height:0;font:0/0 serif;clear:both;visibility:hidden;overflow:hidden}.sm,.sm *,.sm *:before,.sm *:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.main-menu-btn{position:relative;display:inline-block;width:36px;height:36px;text-indent:36px;margin-left:8px;white-space:nowrap;overflow:hidden;cursor:pointer;-webkit-tap-highlight-color:rgba(0,0,0,0)}.main-menu-btn-icon,.main-menu-btn-icon:before,.main-menu-btn-icon:after{position:absolute;top:50%;left:2px;height:2px;width:24px;background:var(--nav-menu-button-color);-webkit-transition:all .25s;transition:all .25s}.main-menu-btn-icon:before{content:'';top:-7px;left:0}.main-menu-btn-icon:after{content:'';top:7px;left:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon{height:0}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:before{top:0;-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}#main-menu-state:checked ~ .main-menu-btn .main-menu-btn-icon:after{top:0;-webkit-transform:rotate(45deg);transform:rotate(45deg)}#main-menu-state{position:absolute;width:1px;height:1px;margin:-1px;border:0;padding:0;overflow:hidden;clip:rect(1px,1px,1px,1px)}#main-menu-state:not(:checked) ~ #main-menu{display:none}#main-menu-state:checked ~ #main-menu{display:block}@media(min-width:768px){.main-menu-btn{position:absolute;top:-99999px}#main-menu-state:not(:checked) ~ #main-menu{display:block}}.sm-dox{background-image:var(--nav-gradient-image)}.sm-dox a,.sm-dox a:focus,.sm-dox a:hover,.sm-dox a:active{padding:0 12px;padding-right:43px;font-family:var(--font-family-nav);font-size:13px;font-weight:bold;line-height:36px;text-decoration:none;text-shadow:var(--nav-text-normal-shadow);color:var(--nav-text-normal-color);outline:0}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a.current{color:#d23600}.sm-dox a.disabled{color:#bbb}.sm-dox a span.sub-arrow{position:absolute;top:50%;margin-top:-14px;left:auto;right:3px;width:28px;height:28px;overflow:hidden;font:bold 12px/28px monospace !important;text-align:center;text-shadow:none;background:var(--nav-menu-toggle-color);-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox a span.sub-arrow:before{display:block;content:'+'}.sm-dox a.highlighted span.sub-arrow:before{display:block;content:'-'}.sm-dox>li:first-child>a,.sm-dox>li:first-child>:not(ul) a{-moz-border-radius:5px 5px 0 0;-webkit-border-radius:5px;border-radius:5px 5px 0 0}.sm-dox>li:last-child>a,.sm-dox>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul{-moz-border-radius:0 0 5px 5px;-webkit-border-radius:0;border-radius:0 0 5px 5px}.sm-dox>li:last-child>a.highlighted,.sm-dox>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>a.highlighted,.sm-dox>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>ul>li:last-child>*:not(ul) a.highlighted{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox ul{background:var(--nav-menu-background-color)}.sm-dox ul a,.sm-dox ul a:focus,.sm-dox ul a:hover,.sm-dox ul a:active{font-size:12px;border-left:8px solid transparent;line-height:36px;text-shadow:none;background-color:var(--nav-menu-background-color);background-image:none}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:0 1px 1px black}.sm-dox ul ul a,.sm-dox ul ul a:hover,.sm-dox ul ul a:focus,.sm-dox ul ul a:active{border-left:16px solid transparent}.sm-dox ul ul ul a,.sm-dox ul ul ul a:hover,.sm-dox ul ul ul a:focus,.sm-dox ul ul ul a:active{border-left:24px solid transparent}.sm-dox ul ul ul ul a,.sm-dox ul ul ul ul a:hover,.sm-dox ul ul ul ul a:focus,.sm-dox ul ul ul ul a:active{border-left:32px solid transparent}.sm-dox ul ul ul ul ul a,.sm-dox ul ul ul ul ul a:hover,.sm-dox ul ul ul ul ul a:focus,.sm-dox ul ul ul ul ul a:active{border-left:40px solid transparent}@media(min-width:768px){.sm-dox ul{position:absolute;width:12em}.sm-dox li{float:left}.sm-dox.sm-rtl li{float:right}.sm-dox ul li,.sm-dox.sm-rtl ul li,.sm-dox.sm-vertical li{float:none}.sm-dox a{white-space:nowrap}.sm-dox ul a,.sm-dox.sm-vertical a{white-space:normal}.sm-dox .sm-nowrap>li>a,.sm-dox .sm-nowrap>li>:not(ul) a{white-space:nowrap}.sm-dox{padding:0 10px;background-image:var(--nav-gradient-image);line-height:36px}.sm-dox a span.sub-arrow{top:50%;margin-top:-2px;right:12px;width:0;height:0;border-width:4px;border-style:solid dashed dashed dashed;border-color:var(--nav-text-normal-color) transparent transparent transparent;background:transparent;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.sm-dox a,.sm-dox a:focus,.sm-dox a:active,.sm-dox a:hover,.sm-dox a.highlighted{padding:0 12px;background-image:var(--nav-separator-image);background-repeat:no-repeat;background-position:right;-moz-border-radius:0 !important;-webkit-border-radius:0;border-radius:0 !important}.sm-dox a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox a:hover span.sub-arrow{border-color:var(--nav-text-hover-color) transparent transparent transparent}.sm-dox a.has-submenu{padding-right:24px}.sm-dox li{border-top:0}.sm-dox>li>ul:before,.sm-dox>li>ul:after{content:'';position:absolute;top:-18px;left:30px;width:0;height:0;overflow:hidden;border-width:9px;border-style:dashed dashed solid dashed;border-color:transparent transparent #bbb transparent}.sm-dox>li>ul:after{top:-16px;left:31px;border-width:8px;border-color:transparent transparent var(--nav-menu-background-color) transparent}.sm-dox ul{border:1px solid #bbb;padding:5px 0;background:var(--nav-menu-background-color);-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-shadow:0 5px 9px rgba(0,0,0,0.2);-webkit-box-shadow:0 5px 9px rgba(0,0,0,0.2);box-shadow:0 5px 9px rgba(0,0,0,0.2)}.sm-dox ul a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-color:transparent transparent transparent var(--nav-menu-foreground-color);border-style:dashed dashed dashed solid}.sm-dox ul a,.sm-dox ul a:hover,.sm-dox ul a:focus,.sm-dox ul a:active,.sm-dox ul a.highlighted{color:var(--nav-menu-foreground-color);background-image:none;border:0 !important}.sm-dox ul a:hover{background-image:var(--nav-gradient-active-image);background-repeat:repeat-x;color:var(--nav-text-hover-color);text-shadow:var(--nav-text-hover-shadow)}.sm-dox ul a:hover span.sub-arrow{border-color:transparent transparent transparent var(--nav-text-hover-color)}.sm-dox span.scroll-up,.sm-dox span.scroll-down{position:absolute;display:none;visibility:hidden;overflow:hidden;background:var(--nav-menu-background-color);height:36px}.sm-dox span.scroll-up:hover,.sm-dox span.scroll-down:hover{background:#eee}.sm-dox span.scroll-up:hover span.scroll-up-arrow,.sm-dox span.scroll-up:hover span.scroll-down-arrow{border-color:transparent transparent #d23600 transparent}.sm-dox span.scroll-down:hover span.scroll-down-arrow{border-color:#d23600 transparent transparent transparent}.sm-dox span.scroll-up-arrow,.sm-dox span.scroll-down-arrow{position:absolute;top:0;left:50%;margin-left:-6px;width:0;height:0;overflow:hidden;border-width:6px;border-style:dashed dashed solid dashed;border-color:transparent transparent var(--nav-menu-foreground-color) transparent}.sm-dox span.scroll-down-arrow{top:8px;border-style:solid dashed dashed dashed;border-color:var(--nav-menu-foreground-color) transparent transparent transparent}.sm-dox.sm-rtl a.has-submenu{padding-right:12px;padding-left:24px}.sm-dox.sm-rtl a span.sub-arrow{right:auto;left:12px}.sm-dox.sm-rtl.sm-vertical a.has-submenu{padding:10px 20px}.sm-dox.sm-rtl.sm-vertical a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-rtl>li>ul:before{left:auto;right:30px}.sm-dox.sm-rtl>li>ul:after{left:auto;right:31px}.sm-dox.sm-rtl ul a.has-submenu{padding:10px 20px !important}.sm-dox.sm-rtl ul a span.sub-arrow{right:auto;left:8px;border-style:dashed solid dashed dashed;border-color:transparent #555 transparent transparent}.sm-dox.sm-vertical{padding:10px 0;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.sm-dox.sm-vertical a{padding:10px 20px}.sm-dox.sm-vertical a:hover,.sm-dox.sm-vertical a:focus,.sm-dox.sm-vertical a:active,.sm-dox.sm-vertical a.highlighted{background:#fff}.sm-dox.sm-vertical a.disabled{background-image:var(--nav-gradient-image)}.sm-dox.sm-vertical a span.sub-arrow{right:8px;top:50%;margin-top:-5px;border-width:5px;border-style:dashed dashed dashed solid;border-color:transparent transparent transparent #555}.sm-dox.sm-vertical>li>ul:before,.sm-dox.sm-vertical>li>ul:after{display:none}.sm-dox.sm-vertical ul a{padding:10px 20px}.sm-dox.sm-vertical ul a:hover,.sm-dox.sm-vertical ul a:focus,.sm-dox.sm-vertical ul a:active,.sm-dox.sm-vertical ul a.highlighted{background:#eee}.sm-dox.sm-vertical ul a.disabled{background:var(--nav-menu-background-color)}} \ No newline at end of file