libmseed 3.2.1
The miniSEED data format library
Loading...
Searching...
No Matches
libmseed.h
Go to the documentation of this file.
1
23
24#ifndef LIBMSEED_H
25#define LIBMSEED_H 1
26
27#ifdef __cplusplus
28extern "C"
29{
30#endif
31
32#define LIBMSEED_VERSION "3.2.1"
33#define LIBMSEED_RELEASE "2025.354"
34
46
59
60/* C99 standard headers */
61#include <ctype.h>
62#include <math.h>
63#include <stdarg.h>
64#include <stdio.h>
65#include <stdlib.h>
66#include <string.h>
67#include <time.h>
68
71#define PRIsize_t "zu"
72
73#if defined(WIN32) || defined(_WIN32) || defined(WIN64) || defined(_WIN64)
74#define LMP_WIN 1
75#endif
76
77/* Set platform specific features, Windows versus everything else */
78#if defined(LMP_WIN)
79#include <sys/timeb.h>
80#include <sys/types.h>
81#include <windows.h>
82
83/* Re-define print conversion for size_t values */
84#undef PRIsize_t
85#if defined(WIN64) || defined(_WIN64)
86#define PRIsize_t "I64u"
87#else
88#define PRIsize_t "I32u"
89#endif
90
91/* For MSVC 2012 and earlier define standard int types, otherwise use inttypes.h */
92#if defined(_MSC_VER) && _MSC_VER <= 1700
93typedef signed char int8_t;
94typedef unsigned char uint8_t;
95typedef signed short int int16_t;
96typedef unsigned short int uint16_t;
97typedef signed int int32_t;
98typedef unsigned int uint32_t;
99typedef signed __int64 int64_t;
100typedef unsigned __int64 uint64_t;
101#else
102#include <inttypes.h>
103#endif
104
105/* For MSVC define PRId64 and SCNd64 and alternate functions */
106#if defined(_MSC_VER)
107#if !defined(PRId64)
108#define PRId64 "I64d"
109#endif
110#if !defined(SCNd64)
111#define SCNd64 "I64d"
112#endif
113
114#define snprintf _snprintf
115#define vsnprintf _vsnprintf
116#define strtoull _strtoui64
117#define fileno _fileno
118#define fdopen _fdopen
119#endif
120
121/* Extras needed for MinGW */
122#if defined(__MINGW32__) || defined(__MINGW64__)
123#include <fcntl.h>
124
125#define _fseeki64 fseeko64
126#define _ftelli64 ftello64
127
128#define fstat _fstat
129#define stat _stat
130#endif
131#else
132/* All other platforms */
133#include <inttypes.h>
134#include <sys/time.h>
135#endif
136
137#define MINRECLEN 40
138#define MAXRECLEN 10485760
139#define MAXRECLENv2 131172
140
141#define LM_SIDLEN 64
142
145#define MS_ISRATETOLERABLE(A, B) (fabs (1.0 - ((A) / (B))) < 0.0001)
146
149#define MS2_ISDATAINDICATOR(X) ((X) == 'D' || (X) == 'R' || (X) == 'Q' || (X) == 'M')
150
167#define MS3_ISVALIDHEADER(X) \
168 (*(X) == 'M' && *((X) + 1) == 'S' && *((X) + 2) == 3 && (uint8_t)(*((X) + 12)) >= 0 && \
169 (uint8_t)(*((X) + 12)) <= 23 && (uint8_t)(*((X) + 13)) >= 0 && (uint8_t)(*((X) + 13)) <= 59 && \
170 (uint8_t)(*((X) + 14)) >= 0 && (uint8_t)(*((X) + 14)) <= 60)
171
188#define MS2_ISVALIDHEADER(X) \
189 ((isdigit ((uint8_t)*(X)) || *(X) == ' ' || !*(X)) && \
190 (isdigit ((uint8_t)*((X) + 1)) || *((X) + 1) == ' ' || !*((X) + 1)) && \
191 (isdigit ((uint8_t)*((X) + 2)) || *((X) + 2) == ' ' || !*((X) + 2)) && \
192 (isdigit ((uint8_t)*((X) + 3)) || *((X) + 3) == ' ' || !*((X) + 3)) && \
193 (isdigit ((uint8_t)*((X) + 4)) || *((X) + 4) == ' ' || !*((X) + 4)) && \
194 (isdigit ((uint8_t)*((X) + 5)) || *((X) + 5) == ' ' || !*((X) + 5)) && \
195 MS2_ISDATAINDICATOR (*((X) + 6)) && (*((X) + 7) == ' ' || *((X) + 7) == '\0') && \
196 (uint8_t)(*((X) + 24)) >= 0 && (uint8_t)(*((X) + 24)) <= 23 && (uint8_t)(*((X) + 25)) >= 0 && \
197 (uint8_t)(*((X) + 25)) <= 59 && (uint8_t)(*((X) + 26)) >= 0 && (uint8_t)(*((X) + 26)) <= 60)
198
200#define bit(x, y) ((x) & (y)) ? 1 : 0
201
203#ifdef _MSC_VER
204#define DEPRECATED __declspec (deprecated)
205#elif defined(__GNUC__) | defined(__clang__)
206#define DEPRECATED __attribute__ ((__deprecated__))
207#else
208#define DEPRECATED
209#endif
210
218
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
285typedef enum
286{
287 ISOMONTHDAY = 0,
288 ISOMONTHDAY_Z = 1,
289 ISOMONTHDAY_DOY = 2,
290 ISOMONTHDAY_DOY_Z = 3,
291 ISOMONTHDAY_SPACE = 4,
292 ISOMONTHDAY_SPACE_Z = 5,
293 SEEDORDINAL = 6,
294 UNIXEPOCH = 7,
295 NANOSECONDEPOCH = 8
297
312typedef enum
313{
314 NONE = 0,
315 MICRO = 1,
316 NANO = 2,
317 MICRO_NONE = 3,
318 NANO_NONE = 4,
319 NANO_MICRO = 5,
320 NANO_MICRO_NONE = 6
322
323extern int ms_nstime2time (nstime_t nstime, uint16_t *year, uint16_t *yday, uint8_t *hour,
324 uint8_t *min, uint8_t *sec, uint32_t *nsec);
325extern char *ms_nstime2timestr_n (nstime_t nstime, char *timestr, size_t timestrsize,
326 ms_timeformat_t timeformat, ms_subseconds_t subsecond);
327DEPRECATED extern char *ms_nstime2timestr (nstime_t nstime, char *timestr,
328 ms_timeformat_t timeformat, ms_subseconds_t subsecond);
329DEPRECATED extern char *ms_nstime2timestrz (nstime_t nstime, char *timestr,
330 ms_timeformat_t timeformat, ms_subseconds_t subsecond);
331extern nstime_t ms_time2nstime (int year, int yday, int hour, int min, int sec, uint32_t nsec);
332extern nstime_t ms_timestr2nstime (const char *timestr);
333extern nstime_t ms_mdtimestr2nstime (const char *timestr);
334extern nstime_t ms_seedtimestr2nstime (const char *seedtimestr);
335extern int ms_doy2md (int year, int yday, int *month, int *mday);
336extern int ms_md2doy (int year, int month, int mday, int *yday);
337
339
349
353#define MS_PACK_DEFAULT_RECLEN 4096
354
358#define MS_PACK_DEFAULT_ENCODING DE_STEIM2
359
363
365typedef struct MS3Record
366{
367 const char *record;
368 int32_t reclen;
369 uint8_t swapflag;
370
371 /* Common header fields in accessible form */
374 uint8_t flags;
376 double samprate;
377 int16_t encoding;
378 uint8_t pubversion;
379 int64_t samplecnt;
380 uint32_t crc;
381 uint16_t extralength;
382 uint32_t datalength;
383 char *extra;
384
385 /* Data sample fields */
387 uint64_t datasize;
388 int64_t numsamples;
390} MS3Record;
391
395#define MS3Record_INITIALIZER \
396 {.record = NULL, \
397 .reclen = -1, \
398 .swapflag = 0, \
399 .sid = {0}, \
400 .formatversion = 0, \
401 .flags = 0, \
402 .starttime = NSTUNSET, \
403 .samprate = 0.0, \
404 .encoding = -1, \
405 .pubversion = 0, \
406 .samplecnt = -1, \
407 .crc = 0, \
408 .extralength = 0, \
409 .datalength = 0, \
410 .extra = NULL, \
411 .datasamples = NULL, \
412 .datasize = 0, \
413 .numsamples = 0, \
414 .sampletype = 0}
415
416extern int msr3_parse (const char *record, uint64_t recbuflen, MS3Record **ppmsr, uint32_t flags,
417 int8_t verbose);
418
419extern int msr3_pack (const MS3Record *msr, void (*record_handler) (char *, int, void *),
420 void *handlerdata, int64_t *packedsamples, uint32_t flags, int8_t verbose);
421
424
425extern MS3RecordPacker *msr3_pack_init (const MS3Record *msr, uint32_t flags, int8_t verbose);
426extern int msr3_pack_next (MS3RecordPacker *packer, char **record, int32_t *reclen);
427extern void msr3_pack_free (MS3RecordPacker **packer, int64_t *packedsamples);
428
429extern int msr3_repack_mseed3 (const MS3Record *msr, char *record, uint32_t recbuflen,
430 int8_t verbose);
431
432extern int msr3_repack_mseed2 (const MS3Record *msr, char *record, uint32_t recbuflen,
433 int8_t verbose);
434
435extern int msr3_pack_header3 (const MS3Record *msr, char *record, uint32_t recbuflen,
436 int8_t verbose);
437
438extern int msr3_pack_header2 (const MS3Record *msr, char *record, uint32_t recbuflen,
439 int8_t verbose);
440
441extern int64_t msr3_unpack_data (MS3Record *msr, int8_t verbose);
442
443extern int msr3_data_bounds (const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize);
444
445extern int64_t ms_decode_data (const void *input, uint64_t inputsize, uint8_t encoding,
446 uint64_t samplecount, void *output, uint64_t outputsize,
447 char *sampletype, int8_t swapflag, const char *sid, int8_t verbose);
448
449extern MS3Record *msr3_init (MS3Record *msr);
450extern void msr3_free (MS3Record **ppmsr);
451extern MS3Record *msr3_duplicate (const MS3Record *msr, int8_t datadup);
452extern nstime_t msr3_endtime (const MS3Record *msr);
453extern void msr3_print (const MS3Record *msr, int8_t details);
454extern int msr3_resize_buffer (MS3Record *msr);
455extern double msr3_sampratehz (const MS3Record *msr);
456extern nstime_t msr3_nsperiod (const MS3Record *msr);
457extern double msr3_host_latency (const MS3Record *msr);
458
459extern int64_t ms3_detect (const char *record, uint64_t recbuflen, uint8_t *formatversion);
460extern int ms_parse_raw3 (const char *record, int maxreclen, int8_t details);
461extern int ms_parse_raw2 (const char *record, int maxreclen, int8_t details, int8_t swapflag);
463
479
487
489typedef struct MS3Selections
490{
491 char sidpattern[100];
494 uint8_t pubversion;
496
497extern const MS3Selections *ms3_matchselect (const MS3Selections *selections, const char *sid,
498 nstime_t starttime, nstime_t endtime, int pubversion,
499 const MS3SelectTime **ppselecttime);
500extern const MS3Selections *msr3_matchselect (const MS3Selections *selections, const MS3Record *msr,
501 const MS3SelectTime **ppselecttime);
502extern int ms3_addselect (MS3Selections **ppselections, const char *sidpattern, nstime_t starttime,
503 nstime_t endtime, uint8_t pubversion);
504extern int ms3_addselect_comp (MS3Selections **ppselections, char *network, char *station,
505 char *location, char *channel, nstime_t starttime, nstime_t endtime,
506 uint8_t pubversion);
507extern int ms3_readselectionsfile (MS3Selections **ppselections, const char *filename);
508extern void ms3_freeselections (MS3Selections *selections);
509extern void ms3_printselections (const MS3Selections *selections);
511
514
537typedef struct MS3RecordPtr
538{
539 const char *bufferptr;
540 FILE *fileptr;
541 const char *filename;
542 int64_t fileoffset;
545 uint32_t dataoffset;
546 void *prvtptr;
549
557
559
594
596#define MSTRACEID_SKIPLIST_HEIGHT 8
597
615
631
633typedef struct MS3TraceList
634{
635 uint32_t numtraceids;
637 uint64_t prngstate;
639
665typedef struct MS3Tolerance
666{
667 double (*time) (const MS3Record *msr);
668 double (*samprate) (
669 const MS3Record *msr);
671
674#define MS3Tolerance_INITIALIZER {.time = NULL, .samprate = NULL}
675
676extern MS3TraceList *mstl3_init (MS3TraceList *mstl);
677extern void mstl3_free (MS3TraceList **ppmstl, int8_t freeprvtptr);
678extern MS3TraceID *mstl3_findID (MS3TraceList *mstl, const char *sid, uint8_t pubversion,
679 MS3TraceID **prev);
680
681extern MS3TraceSeg *mstl3_addmsr (MS3TraceList *mstl, const MS3Record *msr, int8_t splitversion,
682 int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance);
684 MS3RecordPtr **pprecptr, int8_t splitversion,
685 int8_t autoheal, uint32_t flags,
686 const MS3Tolerance *tolerance);
687extern int64_t mstl3_readbuffer (MS3TraceList **ppmstl, const char *buffer, uint64_t bufferlength,
688 int8_t splitversion, uint32_t flags, const MS3Tolerance *tolerance,
689 int8_t verbose);
690extern int64_t mstl3_readbuffer_selection (MS3TraceList **ppmstl, const char *buffer,
691 uint64_t bufferlength, int8_t splitversion,
692 uint32_t flags, const MS3Tolerance *tolerance,
693 const MS3Selections *selections, int8_t verbose);
694extern int64_t mstl3_unpack_recordlist (MS3TraceID *id, MS3TraceSeg *seg, void *output,
695 uint64_t outputsize, int8_t verbose);
696extern int mstl3_convertsamples (MS3TraceSeg *seg, char type, int8_t truncate);
697extern int mstl3_resize_buffers (MS3TraceList *mstl);
698extern int64_t mstl3_pack (MS3TraceList *mstl, void (*record_handler) (char *, int, void *),
699 void *handlerdata, int reclen, int8_t encoding, int64_t *packedsamples,
700 uint32_t flags, int8_t verbose, char *extra);
701
704
705extern MS3TraceListPacker *mstl3_pack_init (MS3TraceList *mstl, int reclen, int8_t encoding,
706 uint32_t flags, int8_t verbose, char *extra,
707 uint32_t flush_idle_seconds);
708extern int mstl3_pack_next (MS3TraceListPacker *packer, uint32_t flags, char **record, int32_t *reclen);
709extern void mstl3_pack_free (MS3TraceListPacker **packer, int64_t *packedsamples);
710
711extern int64_t mstl3_pack_ppupdate_flushidle (MS3TraceList *mstl,
712 void (*record_handler) (char *, int, void *),
713 void *handlerdata, int reclen, int8_t encoding,
714 int64_t *packedsamples, uint32_t flags,
715 int8_t verbose, char *extra,
716 uint32_t flush_idle_seconds);
717
718extern int64_t mstl3_pack_segment (MS3TraceList *mstl, MS3TraceID *id, MS3TraceSeg *seg,
719 void (*record_handler) (char *, int, void *), void *handlerdata,
720 int reclen, int8_t encoding, int64_t *packedsamples,
721 uint32_t flags, int8_t verbose, char *extra);
723 void (*) (char *, int, void *), void *, int, int8_t,
724 int64_t *, uint32_t, int8_t, char *);
725extern void mstl3_printtracelist (const MS3TraceList *mstl, ms_timeformat_t timeformat,
726 int8_t details, int8_t gaps, int8_t versions);
727extern void mstl3_printsynclist (const MS3TraceList *mstl, const char *dccid,
728 ms_subseconds_t subseconds);
729extern void mstl3_printgaplist (const MS3TraceList *mstl, ms_timeformat_t timeformat,
730 double *mingap, double *maxgap);
732
765
767typedef struct LMIO
768{
769 enum
770 {
776 void *handle;
777 void *handle2;
779} LMIO;
780
783#define LMIO_INITIALIZER {.type = LMIO_NULL, .handle = NULL, .handle2 = NULL, .still_running = 0}
784
792typedef struct MS3FileParam
793{
794 char path[512];
795 int64_t startoffset;
796 int64_t endoffset;
797 int64_t streampos;
798 int64_t recordcount;
799
803 uint32_t flags;
806
809#define MS3FileParam_INITIALIZER \
810 {.path = "", \
811 .startoffset = 0, \
812 .endoffset = 0, \
813 .streampos = 0, \
814 .recordcount = 0, \
815 .readbuffer = NULL, \
816 .readlength = 0, \
817 .readoffset = 0, \
818 .flags = 0, \
819 .input = LMIO_INITIALIZER}
820
821extern int ms3_readmsr (MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose);
822extern int ms3_readmsr_r (MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath,
823 uint32_t flags, int8_t verbose);
824extern int ms3_readmsr_selection (MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath,
825 uint32_t flags, const MS3Selections *selections, int8_t verbose);
826extern int ms3_readtracelist (MS3TraceList **ppmstl, const char *mspath,
827 const MS3Tolerance *tolerance, int8_t splitversion, uint32_t flags,
828 int8_t verbose);
829extern int ms3_readtracelist_timewin (MS3TraceList **ppmstl, const char *mspath,
830 const MS3Tolerance *tolerance, nstime_t starttime,
831 nstime_t endtime, int8_t splitversion, uint32_t flags,
832 int8_t verbose);
833extern int ms3_readtracelist_selection (MS3TraceList **ppmstl, const char *mspath,
834 const MS3Tolerance *tolerance,
835 const MS3Selections *selections, int8_t splitversion,
836 uint32_t flags, int8_t verbose);
837extern int ms3_url_useragent (const char *program, const char *version);
838extern int ms3_url_userpassword (const char *userpassword);
839extern int ms3_url_addheader (const char *header);
840extern void ms3_url_freeheaders (void);
841extern int64_t msr3_writemseed (MS3Record *msr, const char *mspath, int8_t overwrite,
842 uint32_t flags, int8_t verbose);
843extern int64_t mstl3_writemseed (MS3TraceList *mstl, const char *mspath, int8_t overwrite,
844 int maxreclen, int8_t encoding, uint32_t flags, int8_t verbose);
845extern int libmseed_url_support (void);
846extern MS3FileParam *ms3_msfp_init_fd (int fd);
847/* Backwards compatibility alias for ms3_msfp_init_fd() */
848#define ms3_mstl_init_fd(fd) ms3_msfp_init_fd(fd)
850
860extern int ms_sid2nslc_n (const char *sid, char *net, size_t netsize, char *sta, size_t stasize,
861 char *loc, size_t locsize, char *chan, size_t chansize);
862DEPRECATED extern int ms_sid2nslc (const char *sid, char *net, char *sta, char *loc, char *chan);
863extern int ms_nslc2sid (char *sid, int sidlen, uint16_t flags, const char *net, const char *sta,
864 const char *loc, const char *chan);
865extern int ms_seedchan2xchan (char *xchan, const char *seedchan);
866extern int ms_xchan2seedchan (char *seedchan, const char *xchan);
867extern int ms_strncpclean (char *dest, const char *source, int length);
868extern int ms_strncpcleantail (char *dest, const char *source, int length);
869extern int ms_strncpopen (char *dest, const char *source, int length);
871
900
926
960
980
996
1002typedef struct LM_PARSED_JSON_s LM_PARSED_JSON;
1003
1006#define mseh_get(msr, ptr, valueptr, type, maxlength) \
1007 mseh_get_ptr_r (msr, ptr, valueptr, type, maxlength, NULL)
1008
1011#define mseh_get_number(msr, ptr, valueptr) mseh_get_ptr_r (msr, ptr, valueptr, 'n', 0, NULL)
1012
1015#define mseh_get_int64(msr, ptr, valueptr) mseh_get_ptr_r (msr, ptr, valueptr, 'i', 0, NULL)
1016
1019#define mseh_get_string(msr, ptr, buffer, maxlength) \
1020 mseh_get_ptr_r (msr, ptr, buffer, 's', maxlength, NULL)
1021
1024#define mseh_get_boolean(msr, ptr, valueptr) mseh_get_ptr_r (msr, ptr, valueptr, 'b', 0, NULL)
1025
1028#define mseh_exists(msr, ptr) (!mseh_get_ptr_r (msr, ptr, NULL, 0, 0, NULL))
1029
1030extern int mseh_get_ptr_r (const MS3Record *msr, const char *ptr, void *value, char type,
1031 uint32_t maxlength, LM_PARSED_JSON **parsestate);
1032
1035#define mseh_set(msr, ptr, valueptr, type) mseh_set_ptr_r (msr, ptr, valueptr, type, NULL)
1036
1039#define mseh_set_number(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, valueptr, 'n', NULL)
1040
1043#define mseh_set_int64(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, valueptr, 'i', NULL)
1044
1047#define mseh_set_string(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, valueptr, 's', NULL)
1048
1051#define mseh_set_boolean(msr, ptr, valueptr) mseh_set_ptr_r (msr, ptr, valueptr, 'b', NULL)
1052
1053extern int mseh_set_ptr_r (MS3Record *msr, const char *ptr, void *value, char type,
1054 LM_PARSED_JSON **parsestate);
1055
1056extern int mseh_add_event_detection_r (MS3Record *msr, const char *ptr,
1057 MSEHEventDetection *eventdetection,
1058 LM_PARSED_JSON **parsestate);
1059
1060extern int mseh_add_calibration_r (MS3Record *msr, const char *ptr, MSEHCalibration *calibration,
1061 LM_PARSED_JSON **parsestate);
1062
1063extern int mseh_add_timing_exception_r (MS3Record *msr, const char *ptr,
1064 MSEHTimingException *exception,
1065 LM_PARSED_JSON **parsestate);
1066
1067extern int mseh_add_recenter_r (MS3Record *msr, const char *ptr, MSEHRecenter *recenter,
1068 LM_PARSED_JSON **parsestate);
1069
1070extern int mseh_serialize (MS3Record *msr, LM_PARSED_JSON **parsestate);
1071extern void mseh_free_parsestate (LM_PARSED_JSON **parsestate);
1072extern int mseh_replace (MS3Record *msr, char *jsonstring);
1073
1074extern int mseh_print (const MS3Record *msr, int indent);
1076
1103
1181
1183#define MAX_LOG_MSG_LENGTH 200
1184
1188typedef struct MSLogEntry
1189{
1190 int level;
1191 char function[30];
1193 struct MSLogEntry *next;
1194} MSLogEntry;
1195
1199typedef struct MSLogRegistry
1200{
1201 int maxmessages;
1202 int messagecnt;
1203 MSLogEntry *messages;
1205
1208#define MSLogRegistry_INITIALIZER {.maxmessages = 0, .messagecnt = 0, .messages = NULL}
1209
1215typedef struct MSLogParam
1216{
1217 void (*log_print) (const char *);
1218 const char *logprefix;
1219 void (*diag_print) (const char *);
1220 const char *errprefix;
1222} MSLogParam;
1223
1226#define MSLogParam_INITIALIZER \
1227 {.log_print = NULL, \
1228 .logprefix = NULL, \
1229 .diag_print = NULL, \
1230 .errprefix = NULL, \
1231 .registry = MSLogRegistry_INITIALIZER}
1232
1236#define ms_log(level, ...) ms_rlog (__func__, level, __VA_ARGS__)
1237
1241#define ms_log_l(logp, level, ...) ms_rlog_l (logp, __func__, level, __VA_ARGS__)
1242
1243#if defined(__GNUC__) || defined(__clang__)
1244__attribute__ ((__format__ (__printf__, 3, 4)))
1245#endif
1246extern int
1247ms_rlog (const char *function, int level, const char *format, ...);
1248#if defined(__GNUC__) || defined(__clang__)
1249__attribute__ ((__format__ (__printf__, 4, 5)))
1250#endif
1251extern int
1252ms_rlog_l (MSLogParam *logp, const char *function, int level, const char *format, ...);
1253
1256#define ms_loginit(log_print, logprefix, diag_print, errprefix) \
1257 ms_rloginit (log_print, logprefix, diag_print, errprefix, 0)
1258
1261#define ms_loginit_l(logp, log_print, logprefix, diag_print, errprefix) \
1262 ms_rloginit_l (logp, log_print, logprefix, diag_print, errprefix, 0)
1263
1264extern void ms_rloginit (void (*log_print) (const char *), const char *logprefix,
1265 void (*diag_print) (const char *), const char *errprefix, int maxmessages);
1266extern MSLogParam *ms_rloginit_l (MSLogParam *logp, void (*log_print) (const char *),
1267 const char *logprefix, void (*diag_print) (const char *),
1268 const char *errprefix, int maxmessages);
1269extern int ms_rlog_emit (MSLogParam *logp, int count, int context);
1270extern int ms_rlog_free (MSLogParam *logp);
1271
1273
1306typedef struct LeapSecond
1307{
1309 int32_t TAIdelta;
1311} LeapSecond;
1312
1315extern int ms_readleapseconds (const char *envvarname);
1316extern int ms_readleapsecondfile (const char *filename);
1318
1322
1323extern uint8_t ms_samplesize (char sampletype);
1324extern int ms_encoding_sizetype (uint8_t encoding, uint8_t *samplesize, char *sampletype);
1325extern const char *ms_encodingstr (uint8_t encoding);
1326extern const char *ms_errorstr (int errorcode);
1327
1328extern nstime_t ms_sampletime (nstime_t time, int64_t offset, double samprate);
1329extern int ms_bigendianhost (void);
1330
1332#define ms_dabs(val) fabs (val)
1333
1335extern int64_t lmp_ftell64 (FILE *stream);
1337extern int lmp_fseek64 (FILE *stream, int64_t offset, int whence);
1339extern uint64_t lmp_nanosleep (uint64_t nanoseconds);
1341extern nstime_t lmp_systemtime (void);
1343extern int lmp_strncasecmp (const char *s1, const char *s2, size_t n);
1344
1346extern uint32_t ms_crc32c (const uint8_t *input, int length, uint32_t previousCRC32C);
1347
1349static inline void
1350ms_gswap2 (void *data2)
1351{
1352 uint16_t dat;
1353
1354 memcpy (&dat, data2, 2);
1355
1356 dat = (uint16_t)(((dat & 0xff00) >> 8) | ((dat & 0x00ff) << 8));
1357
1358 memcpy (data2, &dat, 2);
1359}
1360
1362static inline void
1363ms_gswap4 (void *data4)
1364{
1365 uint32_t dat;
1366
1367 memcpy (&dat, data4, 4);
1368
1369 dat = ((dat & 0xff000000) >> 24) | ((dat & 0x000000ff) << 24) | ((dat & 0x00ff0000) >> 8) |
1370 ((dat & 0x0000ff00) << 8);
1371
1372 memcpy (data4, &dat, 4);
1373}
1374
1376static inline void
1377ms_gswap8 (void *data8)
1378{
1379 uint64_t dat;
1380
1381 memcpy (&dat, data8, sizeof (uint64_t));
1382
1383 dat = ((dat & 0xff00000000000000) >> 56) | ((dat & 0x00000000000000ff) << 56) |
1384 ((dat & 0x00ff000000000000) >> 40) | ((dat & 0x000000000000ff00) << 40) |
1385 ((dat & 0x0000ff0000000000) >> 24) | ((dat & 0x0000000000ff0000) << 24) |
1386 ((dat & 0x000000ff00000000) >> 8) | ((dat & 0x00000000ff000000) << 8);
1387
1388 memcpy (data8, &dat, sizeof (uint64_t));
1389}
1390
1391#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5) || defined(__clang__)
1393__attribute__ ((deprecated ("Use ms_gswap2 instead."))) static inline void
1394ms_gswap2a (void *data2)
1395{
1396 ms_gswap2 (data2);
1397}
1399__attribute__ ((deprecated ("Use ms_gswap4 instead."))) static inline void
1400ms_gswap4a (void *data4)
1401{
1402 ms_gswap4 (data4);
1403}
1405__attribute__ ((deprecated ("Use ms_gswap8 instead."))) static inline void
1406ms_gswap8a (void *data8)
1407{
1408 ms_gswap8 (data8);
1409}
1410#elif defined(_MSC_FULL_VER) && (_MSC_FULL_VER > 140050320)
1412__declspec (deprecated ("Use ms_gswap2 instead.")) static inline void
1413ms_gswap2a (void *data2)
1414{
1415 ms_gswap2 (data2);
1416}
1418__declspec (deprecated ("Use ms_gswap4 instead.")) static inline void
1419ms_gswap4a (void *data4)
1420{
1421 ms_gswap4 (data4);
1422}
1424__declspec (deprecated ("Use ms_gswap8 instead.")) static inline void
1425ms_gswap8a (void *data8)
1426{
1427 ms_gswap8 (data8);
1428}
1429#else
1431static inline void
1432ms_gswap2a (void *data2)
1433{
1434 ms_gswap2 (data2);
1435}
1437static inline void
1438ms_gswap4a (void *data4)
1439{
1440 ms_gswap4 (data4);
1441}
1443static inline void
1444ms_gswap8a (void *data8)
1445{
1446 ms_gswap8 (data8);
1447}
1448#endif
1449
1451
1453typedef int8_t flag;
1454
1477
1479typedef struct LIBMSEED_MEMORY
1480{
1481 void *(*malloc) (size_t);
1482 void *(*realloc) (void *, size_t);
1483 void (*free) (void *);
1485
1488
1502extern size_t libmseed_prealloc_block_size;
1503
1508extern void *libmseed_memory_prealloc (void *ptr, size_t size, size_t *currentsize);
1509
1511
1512#define DE_ASCII DE_TEXT
1513
1522#define DE_TEXT 0
1523#define DE_INT16 1
1524#define DE_INT32 3
1525#define DE_FLOAT32 4
1526#define DE_FLOAT64 5
1527#define DE_STEIM1 10
1528#define DE_STEIM2 11
1529#define DE_GEOSCOPE24 12
1530#define DE_GEOSCOPE163 13
1531#define DE_GEOSCOPE164 14
1532#define DE_CDSN 16
1533#define DE_SRO 30
1534#define DE_DWWSSN 32
1536
1543#define MSSWAP_HEADER 0x01
1544#define MSSWAP_PAYLOAD 0x02
1546
1552#define MS_ENDOFFILE 1
1553#define MS_NOERROR 0
1554#define MS_GENERROR -1
1555#define MS_NOTSEED -2
1556#define MS_WRONGLENGTH -3
1557#define MS_OUTOFRANGE -4
1558#define MS_UNKNOWNFORMAT -5
1559#define MS_STBADCOMPFLAG -6
1560#define MS_INVALIDCRC -7
1562
1570#define MSF_UNPACKDATA 0x0001
1571#define MSF_SKIPNOTDATA 0x0002
1572#define MSF_VALIDATECRC 0x0004
1573#define MSF_PNAMERANGE 0x0008
1574#define MSF_ATENDOFFILE 0x0010
1575#define MSF_SEQUENCE 0x0020
1576#define MSF_FLUSHDATA \
1577 0x0040
1578#define MSF_PACKVER2 0x0080
1579#define MSF_RECORDLIST 0x0100
1580#define MSF_MAINTAINMSTL 0x0200
1581#define MSF_PPUPDATETIME \
1582 0x0400
1583#define MSF_SPLITISVERSION \
1584 0x0800
1585#define MSF_SKIPADJACENTDUPLICATES 0x1000
1587
1588#ifdef __cplusplus
1589}
1590#endif
1591
1592#endif /* LIBMSEED_H */
struct MS3SelectTime * next
Pointer to next selection time, NULL if the last.
Definition libmseed.h:485
nstime_t endtime
Latest data for matching channels, use NSTUNSET for open.
Definition libmseed.h:484
uint8_t pubversion
Selected publication version, use 0 for any.
Definition libmseed.h:494
char sidpattern[100]
Matching (globbing) pattern for source ID.
Definition libmseed.h:491
struct MS3Selections * next
Pointer to next selection, NULL if the last.
Definition libmseed.h:493
nstime_t starttime
Earliest data for matching channels, use NSTUNSET for open.
Definition libmseed.h:483
struct MS3SelectTime * timewindows
Pointer to time window list for this source ID.
Definition libmseed.h:492
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:183
int ms3_readselectionsfile(MS3Selections **ppselections, const char *filename)
Read data selections from a file.
Definition selection.c:427
void ms3_printselections(const MS3Selections *selections)
Print the selections list using the ms_log() facility.
Definition selection.c:702
void ms3_freeselections(MS3Selections *selections)
Free all memory associated with a MS3Selections.
Definition selection.c:660
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:306
const MS3Selections * msr3_matchselect(const MS3Selections *selections, const MS3Record *msr, const MS3SelectTime **ppselecttime)
Test the MS3Record for a matching selection entry.
Definition selection.c:147
Data selection structure time window definition containers.
Definition libmseed.h:482
Data selection structure definition containers.
Definition libmseed.h:490
char type[30]
Definition libmseed.h:911
double duration
Definition libmseed.h:950
char wave[30]
Definition libmseed.h:916
char inputchannel[30]
Definition libmseed.h:953
struct MSEHEventDetection * next
Definition libmseed.h:924
double signalperiod
Definition libmseed.h:914
char amplituderange[30]
Definition libmseed.h:948
int firstpulsepositive
Definition libmseed.h:942
nstime_t onsettime
Definition libmseed.h:919
int medlookback
Definition libmseed.h:922
float vcocorrection
Definition libmseed.h:972
nstime_t endtime
Definition libmseed.h:940
char type[30]
Definition libmseed.h:937
struct MSEHCalibration * next
Definition libmseed.h:958
int continued
Definition libmseed.h:945
char clockstatus[128]
Definition libmseed.h:978
double signalamplitude
Definition libmseed.h:913
double stepbetween
Definition libmseed.h:952
uint32_t count
Definition libmseed.h:975
char units[30]
Definition libmseed.h:917
int alternatesign
Definition libmseed.h:943
char type[30]
Definition libmseed.h:991
double backgroundestimate
Definition libmseed.h:915
nstime_t time
Definition libmseed.h:971
double amplitude
Definition libmseed.h:946
char rolloff[30]
Definition libmseed.h:956
char trigger[30]
Definition libmseed.h:944
char coupling[30]
Definition libmseed.h:955
int steps
Definition libmseed.h:941
char noise[30]
Definition libmseed.h:957
char trigger[30]
Definition libmseed.h:994
char inputunits[30]
Definition libmseed.h:947
double sineperiod
Definition libmseed.h:951
int usec
Definition libmseed.h:973
uint8_t medsnr[6]
Definition libmseed.h:921
int medpickalgorithm
Definition libmseed.h:923
char type[16]
Definition libmseed.h:976
nstime_t begintime
Definition libmseed.h:992
double refamplitude
Definition libmseed.h:954
char detector[30]
Definition libmseed.h:912
nstime_t endtime
Definition libmseed.h:993
nstime_t begintime
Definition libmseed.h:939
int receptionquality
Definition libmseed.h:974
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:829
int mseh_print(const MS3Record *msr, int indent)
Print the extra header structure for the specified MS3Record.
Definition extraheaders.c:1173
int mseh_serialize(MS3Record *msr, LM_PARSED_JSON **parsestate)
Generate extra headers string (serialize) from internal state.
Definition extraheaders.c:1007
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:496
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:156
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:633
void mseh_free_parsestate(LM_PARSED_JSON **parsestate)
Free internally parsed (deserialized) JSON data.
Definition extraheaders.c:1068
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:317
struct LM_PARSED_JSON_s LM_PARSED_JSON
Internal structure for holding parsed JSON extra headers.
Definition libmseed.h:1002
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:921
int mseh_replace(MS3Record *msr, char *jsonstring)
Replace extra headers with supplied JSON.
Definition extraheaders.c:1105
Container for calibration parameters for use in extra headers.
Definition libmseed.h:936
Container for event detection parameters for use in extra headers.
Definition libmseed.h:910
Container for recenter parameters for use in extra headers.
Definition libmseed.h:990
Container for timing exception parameters for use in extra headers.
Definition libmseed.h:970
int readlength
INTERNAL: Length of data in read buffer.
Definition libmseed.h:801
int64_t streampos
OUTPUT: Read position of input stream.
Definition libmseed.h:797
int64_t endoffset
INPUT: End position in input stream, 0 == unknown (e.g. pipe).
Definition libmseed.h:796
int64_t recordcount
OUTPUT: Count of records read from this stream/file so far.
Definition libmseed.h:798
LMIO input
INTERNAL: IO handle, file or URL.
Definition libmseed.h:804
uint32_t flags
INTERNAL: Stream reading state flags.
Definition libmseed.h:803
char path[512]
INPUT: File name or URL.
Definition libmseed.h:794
int readoffset
INTERNAL: Read offset in read buffer.
Definition libmseed.h:802
char * readbuffer
INTERNAL: Read buffer, allocated internally.
Definition libmseed.h:800
int64_t startoffset
INPUT: Start position in input stream.
Definition libmseed.h:795
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:590
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:682
void ms3_url_freeheaders(void)
Free all set headers for URL-based requests.
Definition fileutils.c:866
int ms3_readmsr_r(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, int8_t verbose)
Definition fileutils.c:548
int ms3_url_addheader(const char *header)
Add header to any URL-based requests.
Definition fileutils.c:846
int libmseed_url_support(void)
Run-time test for URL support in libmseed.
Definition fileutils.c:49
MS3FileParam * ms3_msfp_init_fd(int fd)
Initialize MS3FileParam parameters for a file descriptor.
Definition fileutils.c:75
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:526
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:614
int ms3_readmsr_selection(MS3FileParam **ppmsfp, MS3Record **ppmsr, const char *mspath, uint32_t flags, const MS3Selections *selections, int8_t verbose)
Definition fileutils.c:568
int ms3_url_userpassword(const char *userpassword)
Set authentication credentials for URL-based requests.
Definition fileutils.c:817
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:902
int64_t mstl3_writemseed(MS3TraceList *mstl, 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:1000
int ms3_url_useragent(const char *program, const char *version)
Set User-Agent header for URL-based requests.
Definition fileutils.c:787
State container for reading miniSEED records from files or URLs.
Definition libmseed.h:793
int32_t TAIdelta
TAI-UTC difference in seconds.
Definition libmseed.h:1309
nstime_t leapsecond
Time of leap second as epoch since 1 January 1900.
Definition libmseed.h:1308
struct LeapSecond * next
Pointer to next entry, NULL if the last.
Definition libmseed.h:1310
LeapSecond * leapsecondlist
int ms_readleapsecondfile(const char *filename)
Read leap second from the specified file.
Definition genutils.c:1853
int ms_readleapseconds(const char *envvarname)
Read leap second file specified by an environment variable.
Definition genutils.c:1824
Leap second list container.
Definition libmseed.h:1307
void(* diag_print)(const char *)
Function to call for diagnostic and error messages.
Definition libmseed.h:1219
char message[MAX_LOG_MSG_LENGTH]
Log, warning or error message.
Definition libmseed.h:1192
char function[30]
Function generating the message.
Definition libmseed.h:1191
void(* log_print)(const char *)
Function to call for regular messages.
Definition libmseed.h:1217
int level
Message level.
Definition libmseed.h:1190
const char * logprefix
Message prefix for regular and diagnostic messages.
Definition libmseed.h:1218
const char * errprefix
Message prefix for error messages.
Definition libmseed.h:1220
MSLogRegistry registry
Message registry.
Definition libmseed.h:1221
int ms_rlog_l(MSLogParam *logp, const char *function, int level, const char *format,...)
Register log message using specified logging parameters.
Definition logging.c:299
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:128
#define MAX_LOG_MSG_LENGTH
Definition libmseed.h:1183
int ms_rlog_free(MSLogParam *logp)
Free, without emitting, all messages from log registry.
Definition logging.c:612
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:88
int ms_rlog(const char *function, int level, const char *format,...)
Register log message using global logging parameters.
Definition logging.c:247
int ms_rlog_emit(MSLogParam *logp, int count, int context)
Emit, aka send to print functions, messages from log registry.
Definition logging.c:551
Log registry entry.
Definition libmseed.h:1189
Logging parameters. Callers should not modify these values directly and generally should not need to ...
Definition libmseed.h:1216
Log message registry.
Definition libmseed.h:1200
void(* free)(void *)
Pointer to desired free().
Definition libmseed.h:1483
LIBMSEED_MEMORY libmseed_memory
void * libmseed_memory_prealloc(void *ptr, size_t size, size_t *currentsize)
size_t libmseed_prealloc_block_size
Definition libmseed.h:1480
uint8_t swapflag
Byte swap indicator (bitmask), see Byte swap flags.
Definition libmseed.h:369
void * datasamples
Data samples, numsamples of type sampletype.
Definition libmseed.h:386
uint32_t datalength
Length of data payload in bytes.
Definition libmseed.h:382
uint32_t crc
CRC of entire record.
Definition libmseed.h:380
uint8_t formatversion
Format major version.
Definition libmseed.h:373
int32_t reclen
Length of miniSEED record in bytes.
Definition libmseed.h:368
uint8_t flags
Record-level bit flags.
Definition libmseed.h:374
uint16_t extralength
Length of extra headers in bytes.
Definition libmseed.h:381
uint64_t datasize
Size of datasamples buffer in bytes.
Definition libmseed.h:387
const char * record
Raw miniSEED record, if available.
Definition libmseed.h:367
double samprate
Nominal sample rate as samples/second (Hz) or period (s).
Definition libmseed.h:376
int64_t numsamples
Number of data samples in datasamples.
Definition libmseed.h:388
int64_t samplecnt
Number of samples in record.
Definition libmseed.h:379
char sampletype
Sample type code: t, i, f, d Sample Types.
Definition libmseed.h:389
int16_t encoding
Data encoding format, see Data Encodings.
Definition libmseed.h:377
nstime_t starttime
Record start time (first sample).
Definition libmseed.h:375
char sid[LM_SIDLEN]
Source identifier as URN, max length LM_SIDLEN.
Definition libmseed.h:372
uint8_t pubversion
Publication version.
Definition libmseed.h:378
char * extra
Pointer to extra headers.
Definition libmseed.h:383
int64_t ms3_detect(const char *record, uint64_t recbuflen, uint8_t *formatversion)
Detect miniSEED record in buffer.
Definition parseutils.c:175
MS3RecordPacker * msr3_pack_init(const MS3Record *msr, uint32_t flags, int8_t verbose)
Initialize a packer for generator-style record creation.
Definition pack.c:174
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:601
struct MS3RecordPacker MS3RecordPacker
Opaque packing context for MS3Record generator-style interface.
Definition libmseed.h:423
void msr3_print(const MS3Record *msr, int8_t details)
Print header values of an MS3Record.
Definition msrutils.c:225
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:343
int64_t msr3_unpack_data(MS3Record *msr, int8_t verbose)
Unpack data samples for a MS3Record.
Definition unpack.c:1170
double msr3_host_latency(const MS3Record *msr)
Calculate data latency based on the host time.
Definition msrutils.c:393
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:926
void msr3_free(MS3Record **ppmsr)
Free all memory associated with a MS3Record.
Definition msrutils.c:86
int ms_parse_raw3(const char *record, int maxreclen, int8_t details)
Parse and verify a miniSEED 3.x record header.
Definition parseutils.c:325
int msr3_resize_buffer(MS3Record *msr)
Resize data sample buffer of MS3Record to what is needed.
Definition msrutils.c:301
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:1325
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
int msr3_repack_mseed2(const MS3Record *msr, char *record, uint32_t recbuflen, int8_t verbose)
Repack a parsed miniSEED record into a version 2 record.
Definition pack.c:815
int msr3_pack_next(MS3RecordPacker *packer, char **record, int32_t *reclen)
Generate next miniSEED record.
Definition pack.c:352
MS3Record * msr3_duplicate(const MS3Record *msr, int8_t datadup)
Duplicate a MS3Record.
Definition msrutils.c:118
nstime_t msr3_endtime(const MS3Record *msr)
Calculate time of the last sample in a record.
Definition msrutils.c:200
void msr3_pack_free(MS3RecordPacker **packer, int64_t *packedsamples)
Free packer and resources.
Definition pack.c:563
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:529
nstime_t msr3_nsperiod(const MS3Record *msr)
Calculate sample period in nanoseconds/sample for a given MS3Record.
Definition msrutils.c:362
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:696
int msr3_data_bounds(const MS3Record *msr, uint32_t *dataoffset, uint32_t *datasize)
Determine the data payload bounds for a MS3Record.
Definition unpack.c:1073
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 using a callback function to handle the records.
Definition pack.c:110
miniSEED record container
Definition libmseed.h:366
struct MS3RecordPtr * next
Pointer to next entry, NULL if the last.
Definition libmseed.h:547
void * prvtptr
Private pointer, will not be populated by library but will be free'd.
Definition libmseed.h:546
MS3RecordPtr * last
Pointer to last entry, NULL if the none.
Definition libmseed.h:555
int64_t fileoffset
Offset into file to record for fileptr or filename.
Definition libmseed.h:542
const char * filename
Pointer to file name containing record, NULL if not used.
Definition libmseed.h:541
MS3RecordPtr * first
Pointer to first entry, NULL if the none.
Definition libmseed.h:554
MS3Record * msr
Pointer to MS3Record for this record.
Definition libmseed.h:543
const char * bufferptr
Pointer in buffer to record, NULL if not used.
Definition libmseed.h:539
FILE * fileptr
Pointer to open FILE containing record, NULL if not used.
Definition libmseed.h:540
uint64_t recordcnt
Count of records in the list (for convenience).
Definition libmseed.h:553
nstime_t endtime
End time of record, time of last sample.
Definition libmseed.h:544
uint32_t dataoffset
Offset from start of record to encoded data.
Definition libmseed.h:545
Record list, holds MS3RecordPtr entries that contribute to a given MS3TraceSeg.
Definition libmseed.h:552
A miniSEED record pointer and metadata.
Definition libmseed.h:538
int ms_sid2nslc_n(const char *sid, char *net, size_t netsize, char *sta, size_t stasize, char *loc, size_t locsize, char *chan, size_t chansize)
Parse network, station, location and channel codes from an FDSN Source ID.
Definition genutils.c:243
int ms_strncpopen(char *dest, const char *source, int length)
Copy fixed number of characters into unterminated string.
Definition genutils.c:808
DEPRECATED int ms_sid2nslc(const char *sid, char *net, char *sta, char *loc, char *chan)
Definition genutils.c:360
int ms_strncpclean(char *dest, const char *source, int length)
Copy string, removing spaces, always terminated.
Definition genutils.c:702
int ms_xchan2seedchan(char *seedchan, const char *xchan)
Convert extended channel to SEED 2.x channel.
Definition genutils.c:592
int ms_seedchan2xchan(char *xchan, const char *seedchan)
Convert SEED 2.x channel to extended channel.
Definition genutils.c:537
int ms_strncpcleantail(char *dest, const char *source, int length)
Copy string, removing trailing spaces, always terminated.
Definition genutils.c:756
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:398
struct MS3TraceID * next[MSTRACEID_SKIPLIST_HEIGHT]
Next trace ID at first pointer, NULL if the last.
Definition libmseed.h:627
int64_t numsamples
Number of data samples in datasamples.
Definition libmseed.h:607
struct MS3RecordList * recordlist
List of pointers to records that contributed.
Definition libmseed.h:611
uint64_t prngstate
INTERNAL: State for Pseudo RNG.
Definition libmseed.h:637
nstime_t endtime
Time of last sample.
Definition libmseed.h:602
struct MS3TraceSeg * first
Pointer to first of list of segments.
Definition libmseed.h:625
nstime_t latest
Time of latest sample.
Definition libmseed.h:622
struct MS3TraceID traces
Head node of trace skip list, first entry at traces.next[0].
Definition libmseed.h:636
uint8_t pubversion
Largest contributing publication version.
Definition libmseed.h:620
void * prvtptr
Definition libmseed.h:609
uint8_t height
Height of skip list at next.
Definition libmseed.h:629
uint64_t datasize
Size of datasamples buffer in bytes.
Definition libmseed.h:606
nstime_t earliest
Time of earliest sample.
Definition libmseed.h:621
double(* samprate)(const MS3Record *msr)
Pointer to function that returns sample rate tolerance.
Definition libmseed.h:668
void * prvtptr
Private pointer for general use, unused by library.
Definition libmseed.h:623
void * datasamples
Data samples, numsamples of type sampletype.
Definition libmseed.h:605
char sampletype
Sample type code, see Sample Types.
Definition libmseed.h:608
struct MS3TraceSeg * prev
Pointer to previous segment.
Definition libmseed.h:612
int64_t samplecnt
Number of samples in trace coverage.
Definition libmseed.h:604
char sid[LM_SIDLEN]
Source identifier as URN, max length LM_SIDLEN.
Definition libmseed.h:619
struct MS3TraceSeg * last
Pointer to last of list of segments.
Definition libmseed.h:626
uint32_t numtraceids
Number of traces IDs in list.
Definition libmseed.h:635
double(* time)(const MS3Record *msr)
Pointer to function that returns time tolerance.
Definition libmseed.h:667
double samprate
Nominal sample rate (Hz).
Definition libmseed.h:603
struct MS3TraceSeg * next
Pointer to next segment, NULL if the last.
Definition libmseed.h:613
nstime_t starttime
Time of first sample.
Definition libmseed.h:601
uint32_t numsegments
Number of segments for this ID.
Definition libmseed.h:624
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:1638
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:2877
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:2742
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:2059
void mstl3_free(MS3TraceList **ppmstl, int8_t freeprvtptr)
Free all memory associated with a MS3TraceList.
Definition tracelist.c:102
MS3TraceSeg * mstl3_addmsr(MS3TraceList *mstl, const MS3Record *msr, int8_t splitversion, int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance)
Add data coverage from an MS3Record to a MS3TraceList.
Definition tracelist.c:776
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:840
int mstl3_pack_next(MS3TraceListPacker *packer, uint32_t flags, char **record, int32_t *reclen)
Generate next miniSEED record from trace list packing state.
Definition tracelist.c:2189
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:2948
int64_t mstl3_pack_segment(MS3TraceList *mstl, MS3TraceID *id, MS3TraceSeg *seg, 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 a MS3TraceSeg data into miniSEED records.
Definition tracelist.c:2565
int mstl3_resize_buffers(MS3TraceList *mstl)
Resize data sample buffers of MS3TraceList to what is needed.
Definition tracelist.c:1547
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:888
struct MS3TraceListPacker MS3TraceListPacker
Opaque packing context for MS3TraceList generator-style interface.
Definition libmseed.h:703
int64_t mstl3_pack_ppupdate_flushidle(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, uint32_t flush_idle_seconds)
Definition tracelist.c:2078
DEPRECATED int64_t mstraceseg3_pack(MS3TraceID *, MS3TraceSeg *, void(*)(char *, int, void *), void *, int, int8_t, int64_t *, uint32_t, int8_t, char *)
Definition tracelist.c:2710
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:1395
MS3TraceList * mstl3_init(MS3TraceList *mstl)
Initialize a MS3TraceList container.
Definition tracelist.c:67
#define MSTRACEID_SKIPLIST_HEIGHT
Maximum skip list height for MSTraceIDs.
Definition libmseed.h:596
MS3TraceID * mstl3_findID(MS3TraceList *mstl, const char *sid, uint8_t pubversion, MS3TraceID **prev)
Find matching MS3TraceID in a MS3TraceList.
Definition tracelist.c:163
void mstl3_pack_free(MS3TraceListPacker **packer, int64_t *packedsamples)
Free trace list packing state and resources.
Definition tracelist.c:2490
MS3TraceListPacker * mstl3_pack_init(MS3TraceList *mstl, int reclen, int8_t encoding, uint32_t flags, int8_t verbose, char *extra, uint32_t flush_idle_seconds)
Initialize a packing state for generator-style trace list packing.
Definition tracelist.c:2122
MS3TraceSeg * mstl3_addmsr_recordptr(MS3TraceList *mstl, const MS3Record *msr, MS3RecordPtr **pprecptr, int8_t splitversion, int8_t autoheal, uint32_t flags, const MS3Tolerance *tolerance)
Definition tracelist.c:798
Callback functions that return time and sample rate tolerances.
Definition libmseed.h:666
Container for a trace ID, linkable.
Definition libmseed.h:618
Container for a collection of continuous trace segment, linkable.
Definition libmseed.h:634
Container for a continuous trace segment, linkable.
Definition libmseed.h:600
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:1800
uint64_t lmp_nanosleep(uint64_t nanoseconds)
Sleep for a specified number of nanoseconds.
Definition genutils.c:2022
nstime_t ms_sampletime(nstime_t time, int64_t offset, double samprate)
Calculate the time of a sample in an array.
Definition genutils.c:1761
int lmp_fseek64(FILE *stream, int64_t offset, int whence)
Definition genutils.c:2000
int64_t lmp_ftell64(FILE *stream)
Definition genutils.c:1984
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
nstime_t lmp_systemtime(void)
Return the current system time.
Definition genutils.c:2054
int lmp_strncasecmp(const char *s1, const char *s2, size_t n)
Case-insensitive, ASCII-only string comparison.
Definition genutils.c:2101
int8_t flag
Definition libmseed.h:1453
#define LM_SIDLEN
Length of source ID string.
Definition libmseed.h:141
#define DEPRECATED
Definition libmseed.h:208
Type definition for data source I/O: file-system versus URL.
Definition libmseed.h:768
void * handle
Primary IO handle, either file or URL.
Definition libmseed.h:776
void * handle2
Secondary IO handle for URL.
Definition libmseed.h:777
int still_running
Fetch status flag for URL transmissions.
Definition libmseed.h:778
enum LMIO::@254045037044215310213377126306215005316170340112 type
IO handle type.
@ LMIO_FD
IO handle is a provided file descriptor.
Definition libmseed.h:774
@ LMIO_URL
IO handle is URL-type.
Definition libmseed.h:773
@ LMIO_NULL
IO handle type is undefined.
Definition libmseed.h:771
@ LMIO_FILE
IO handle is FILE-type.
Definition libmseed.h:772