Changeset 8041


Ignore:
Timestamp:
08/14/19 01:36:27 (4 months ago)
Author:
stefan
Message:

trunk now merged into cosmos branch

Location:
branches/cosmos
Files:
2 deleted
82 edited
11 copied

Legend:

Unmodified
Added
Removed
  • branches/cosmos

  • branches/cosmos/debian/changelog

    r7768 r8041  
    1 earthworm (7.10-1ubuntu1) UNRELEASED; urgency=medium 
     1earthworm (7.10-1ubuntu2) UNRELEASED; urgency=medium 
     2 
     3  * Includes fix for missing Fortran-dependent binaries 
     4 
     5 -- Alexander Schnackenberg <a.schnackenberg@isti.com>  Mon, 01 Jul 2019 19:20:16 -0400 
     6 
     7earthworm (7.10-1ubuntu1) RELEASED; urgency=medium 
    28 
    39  * Initial release.  
    4   * Adding in new version of Swarm (2.8.7) 
     10  * Adding in new version of Swarm (2.8.9) 
    511 
    612 -- Alexander Schnackenberg <a.schnackenberg@isti.com>  Tue, 05 Feb 2019 13:57:06 -0500 
  • branches/cosmos/debian/control

    r7765 r8041  
    1 Source: earthworm 
     1Package: earthworm 
     2Version: 7.10-1ubuntu2 
     3Architecture: amd64 
     4Maintainer: Alexander Schnackenberg <a.schnackenberg@isti.com> 
     5Installed-Size: 200053 
     6Depends: libgfortran4 
    27Section: science 
    38Priority: optional 
    4 Maintainer: Alexander Schnackenberg <a.schnackenberg@isti.com> 
    5 Build-Depends: debhelper (>= 10) 
    6 Standards-Version: 4.3.0.1 
    79Homepage: www.earthwormcentral.org 
    8  
    9 Package: earthworm 
    10 Architecture: any 
    11 Depends: libgfortran4 
    1210Description: Earthworm provides users with an advanced open source seismic data acquisition and processing 
    1311 capable of calculating earthquake locations and magnitudes. 
    14  .  
     12 . 
    1513 The Earthworm system is a robust and mature software tool, incorporating over 25 years of design and 
    1614 development. 
  • branches/cosmos/debian/rules

    r7765 r8041  
    2323FC=gfortran 
    2424export FC 
    25 export FFLAGS:=$(TARGET)-O -g -Wunitialized -Werror=line-truncation -ffpe-trap=invalid,zero,overflow -fbacktrace 
     25export FFLAGS:=$(TARGET)-O -g -Wuninitialized -Werror=line-truncation -ffpe-trap=invalid,zero,overflow -fbacktrace 
    2626 
    2727%: 
  • branches/cosmos/doc/WEB_DOC/RELEASE/release_notes.v7.10.html

    r7963 r8041  
    11<HTML> 
    22<HEAD> 
    3 <TITLE> EW v7.10 released on March 19, 2019</TITLE> 
     3<TITLE> EW v7.10 released on August 12, 2019</TITLE> 
    44 
    55<BODY TEXT="#000000" BGCOLOR="#FADFAF" LINK="#0000EE" VLINK="#551A8B" ALINK="#FF 
     
    173173Fixed the SPARC 64-bit alignment traps. 
    174174Larry Baker March 1, 2019 
     175 
     176 
     177ew2moledb 
     178* preserve query when error "Lost connection to MySQL server during query" occurs. (Error code: 2013) 
     179* preserve query when error "MySQL server has gone away" occurs. (Error code: 2006) 
     180* fix precision to millisecond in datetime fields 
     181Matteo Quintiliani - May 28, 2019 
     182 
     183 
    175184 
    176185<b><a name=config>CHANGES TO CONFIGURATION FILES and DESCRIPTOR FILES:</a></b> 
  • branches/cosmos/doc/WEB_DOC/index.html

    r7963 r8041  
    191191<h2><a name="rel_notes"></a>Section 4.&nbsp; Release Notes</h2> 
    192192<ul> 
    193   <li><a href="RELEASE/release_notes.v7.10.html">This Release - v7.10</a> - 03/2019<br> 
     193  <li><a href="RELEASE/release_notes.v7.10.txt">This Release - v7.10</a> - 08/2019<br> 
    194194  <li><a href="RELEASE/release_notes.v7.9.html">v7.9</a> - 10/2016<br> 
    195195  <li><a href="RELEASE/release_notes.v7.8.html">v7.8</a> - 06/2015<br> 
  • branches/cosmos/doc/WEB_DOC/modules.html

    r6864 r8041  
    2222        align="texttop" height="61" width="71"> 
    2323      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;EARTHWORM MODULES</h1> 
    24     <div align="right">Last revised October 26, 2016&nbsp;&nbsp;&nbsp;&nbsp;</div> 
    25     <big><b>Version 7.9</b></big> 
     24    <div align="right">Last revised June 3, 2019&nbsp;&nbsp;&nbsp;&nbsp;</div> 
     25    <big><b>Version 7.10</b></big> 
    2626    <h2>Modules Index</h2>  
    2727    <a href="#sys">SYSTEM</a><br> 
  • branches/cosmos/environment/ew_linux.bash

    r7914 r8041  
    11# Enable USE_CC_BITS to default EW_BITs to the compiler target (removes -m32/64) 
    2 # Otherwise, the default is 32, as it was 
     2# Otherwise, the default is 32, as it was. 'true' should get you 64 bit on a 64 
     3# bit system. 
    34USE_CC_BITS=true 
    45 
  • branches/cosmos/environment/ew_macosx_intel.sh

    r7914 r8041  
    44 
    55# Enable USE_CC_BITS to default EW_BITs to the compiler target (removes -m32/64) 
    6 # Otherwise, the default is 32, as it was 
     6# Otherwise, the default is 32, as it was. 'true' should get you 64 bit on a 64 
     7# bit system. 
     8 
    79USE_CC_BITS=true 
    810 
  • branches/cosmos/environment/ew_nt.cmd

    r7952 r8041  
    88Set EW_HOME=C:\earthworm 
    99Set EW_VERSION=earthworm_7.10 
    10 Set EW_BITS=32 
     10# EW_BITS is form compile-time only, not run-time. It sets whether to  
     11# build as a 64 bit application or a 32 bit application. The two are not 
     12# interoperable 
     13Set EW_BITS=64 
    1114 
    1215Set EW_RUN_DIR=%EW_HOME%\run_working 
  • branches/cosmos/include/rw_strongmotionII.h

    r6447 r8041  
    312312MEMBER_TYPE double[SM_MAX_RSA] 
    313313MEMBER_DESCRIPTION RSA value for each given period. (cm/s/s) 
     314 
     315MEMBER ai 
     316MEMBER_TYPE double 
     317MEMBER_DESCRIPTION The AI (Arias Intensity) value. (cm/s/s) 
    314318 
    315319MEMBER tload 
     
    362366   double  rsa[SM_MAX_RSA];      /* RSA value (cm/s/s) at given period             */  
    363367   double  trsa[SM_MAX_RSA];     /* time of rsa at given period                    */  
     368   double  ai;                   /* OPTIONAL: Arias Intensity                      */ 
    364369 
    365370/* fields supplied by DBMS: */ 
  • branches/cosmos/include/startstop_version.h

    r7964 r8041  
    11 
    2 #define STARTSTOP_VERSION "v7.10 2019-03-19" 
     2#define STARTSTOP_VERSION "v7.10 2019-08-13" 
  • branches/cosmos/params/ew2moledb.desc

    r6237 r8041  
    2626modName  ew2moledb  
    2727modId    MOD_EW2MOLEDB 
    28 instId   ${EW_INST_ID} 
     28instId   ${EW_INSTALLATION} 
    2929# 
    3030# 
  • branches/cosmos/params/ewhtmlemail.d

    r7968 r8041  
    199199 MaxDuration    60.0   # defaults to 144 seconds, new feature 
    200200 
     201 # EWAVE: a RESTful plotting service, optional (instead of Google Trace API or GIF) 
     202 # Uncomment the following parameters to use it 
     203 # EwaveAddr   127.0.0.1 
     204 # EwavePort     5000 
    201205 
    202206 #UseGIF                                # Not yet functional 
  • branches/cosmos/params/gmew.d

    r7968 r8041  
    243243 
    244244## OPTIONAL PARAMETER 
     245## ariasIntensity: When present this parameter causes the Arias Intensity 
     246# value to be calculated and appended to the TYPE_STRONGMOTION2 messages. 
     247# This is optional. 
     248# 
     249#ariasIntensity 
     250 
     251## OPTIONAL PARAMETER 
    245252## sendActivate: When present this parameter sends an activated_scripts 
    246253# message with the eventID as the first argument and written XML file as the 
  • branches/cosmos/params/startstop.desc

    r7968 r8041  
    3535#    until the status manager is restarted. 
    3636# 
    37 tsec: 60  page: 0  mail: 99 
     37tsec: 30  page: 0  mail: 1 
    3838# 
    3939# 
  • branches/cosmos/params/startstop_nt.d

    r7968 r8041  
    99#    amount of physical RAM and configured virtual (paging) memory  
    1010#    available. A good place to start is 1024 kilobytes.  
    11 #    Ring names are listed in file earthworm.d. 
     11#    Ring names are listed in file earthworm.h. 
    1212# 
    1313  nRing               4 
    14   Ring   AD_RING   1024 
    15   Ring   WAVE_RING 1024 
    16   Ring   PICK_RING 1024 
    17   Ring   HYPO_RING 1024 
     14  Ring   EEW_RING   1024 
     15  Ring   WAVE_RING  4064 
     16  Ring   PICK_RING  1024 
     17  Ring   HYPO_RING  1024 
    1818# 
    1919 MyModuleId       MOD_STARTSTOP  # Module Id for this program 
     
    2525                                 #  for a child process to self-terminate 
    2626                                 #  before killing it 
    27  # statmgrDelay     2            # Uncomment to specify the number of seconds 
    28                                  # to wait after starting statmgr  
    29                                  # default is 1 second 
    30 #maxStatusLineLen 158            # Uncomment to set the maximum value of a  
     27 # statmgrDelay     2        # Uncomment to specify the number of seconds 
     28                       # to wait after starting statmgr  
     29                       # default is 1 second 
     30# maxStatusLineLen 80            # Uncomment to set the maximum value of a  
    3131                                 # status line length. 80 is the default 
    32                                  # if this parameter is not set 
    33 #PipeName      EarthwormStartstopPipe # name of "named pipe" for  
     32# PipeName      EarthwormStartstopPipe # name of "named pipe" for  
    3433                                 # startstopconsole to access. you only 
    3534                                 # need to use this if you're running  
    36   
     35                                 # multiple startstops on one Windows box 
    3736 
    3837# 
     
    5958#    To comment out a line, preceed the line by #. 
    6059# 
    61  Process          "statmgr statmgr.d" 
     60 
     61 Process          "tankplayer tankplayer.d" 
     62 PriorityClass     Normal 
     63 ThreadPriority    Normal 
     64 Display           MinimizedConsole 
     65 
     66 
     67 Process          "pick_eew_v1 pick_eew.d"  
    6268 PriorityClass     Normal 
    6369 ThreadPriority    Normal 
    6470 Display           NewConsole 
    65 # 
    66 # Process          "adsend adsend.d" 
    67 # PriorityClass     RealTime 
    68 # ThreadPriority    TimeCritical 
    69 # Display           NewConsole 
    70 # 
    71 #  Process          "coaxtoring coaxtoring.d" 
    72 #  PriorityClass     RealTime 
    73 #  ThreadPriority    TimeCritical 
    74 #  Display           NewConsole 
    75 # 
    76  Process          "pick_ew pick_ew.d" 
     71  
     72 Process          "tcpd_v1   tcpd.d" 
    7773 PriorityClass     Normal 
    7874 ThreadPriority    Normal 
    7975 Display           NewConsole 
    80 # 
    81  Process          "binder binder.d" 
     76  
     77 Process          "dcsn_xml_v1  dcsn_xml.d" 
    8278 PriorityClass     Normal 
    8379 ThreadPriority    Normal 
    84  Display           NewConsole 
    85 # 
    86  Process          "eqproc eqproc.d" 
     80 Display           MinimizedConsole 
     81 
     82 Process          "wave_serverV  wave_serverV.d" 
    8783 PriorityClass     Normal 
    8884 ThreadPriority    Normal 
    89  Display           NewConsole 
    90 # 
    91 # Process          "copystatus WAVE_RING HYPO_RING" 
    92 # PriorityClass     Normal 
    93 # ThreadPriority    Normal 
    94 # Display           NoNewConsole 
    95 # 
    96 # Process          "copystatus PICK_RING HYPO_RING" 
    97 # PriorityClass     Normal 
    98 # ThreadPriority    Normal 
    99 # Display           NoNewConsole 
    100 # 
    101 # Process          "diskmgr diskmgr.d" 
    102 # PriorityClass     Normal 
    103 # ThreadPriority    Normal 
    104 # Display           NoNewConsole 
    105 # 
    106 # Process          "menlo_report menlo_report.d" 
    107 # PriorityClass     Normal 
    108 # ThreadPriority    Normal 
    109 # Display           NewConsole 
    110 # 
    111 # Process          "pagerfeeder pagerfeeder.d" 
    112 # PriorityClass     Normal 
    113 # ThreadPriority    Normal 
    114 # Display           NewConsole 
    115 # 
    116 # Process          "ringtocoax ringtocoax.d" 
    117 # PriorityClass     Normal 
    118 # ThreadPriority    Normal 
    119 # Display           NewConsole 
    120 # 
    121 # Process          "tankplayer tankplayer.d" 
    122 # PriorityClass     Normal 
    123 # ThreadPriority    Normal 
    124 # Display           NewConsole 
    125 # 
    126 # Process          "import_generic import_generic.d" 
    127 # PriorityClass     Normal 
    128 # ThreadPriority    Normal 
    129 # Display           NewConsole 
    130 # 
    131 # Process          "export_generic export_generic.d" 
    132 # PriorityClass     Normal 
    133 # ThreadPriority    Normal 
    134 # Display           NewConsole 
    135 # 
    136 # Process          "export_scn export_scn.d" 
    137 # PriorityClass     Normal 
    138 # ThreadPriority    Normal 
    139 # Display           NewConsole 
    140 # 
     85 Display           MinimizedConsole  
     86  
     87 Process          "wave_viewer  wave_viewer.d" 
     88 PriorityClass     Normal 
     89 ThreadPriority    Normal 
     90 Display           MinimizedConsole  
    14191 
    142  
    143  
    144  
    145  
    146  
    147  
    148  
    149  
    150  
    151  
    152  
    153  
    154  
    155  
    156  
    157  
    158  
    159  
    160  
    161  
    162  
    163  
    164  
    165  
    166  
    167  
    168  
    169  
    170  
    171  
    172  
    173  
    174  
    175  
    176  
    177  
    178  
    179  
    180  
    181  
    182  
    183  
    184  
    185  
    186  
    187  
    188  
    189  
    190  
    191  
    192  
    193  
    194  
    195  
    196  
    197  
    198  
    199  
    200  
    201  
    202  
    203  
    204  
    205  
    206  
    207  
    208  
    209  
    210  
    211  
    212  
    213  
    214  
    215  
    216  
    217  
    218  
    219  
    220  
    221  
    222  
    223  
    224  
    225  
    226  
    227  
    228  
    229  
    230  
    231  
    232  
    233  
    234  
    235  
    236  
    237  
    238  
    239  
    240  
    241  
    242  
    243  
    244  
    245  
    246  
    247  
    248  
    249  
    250  
    251  
    252  
    253  
    254  
    255  
    256  
    257  
    258  
    259  
    260  
    261  
    262  
    263  
    264  
    265  
    266  
    267  
    268  
    269  
    270  
    271  
    272  
    273  
    274  
  • branches/cosmos/params/startstop_unix.d

    r5930 r8041  
    11# 
    2 #       Startstop (Unix Version -- Linux) Configuration File 
     2#                 Startstop Configuration File for Unix 
    33# 
    44#    <nRing> is the number of transport rings to create. 
    55#    <Ring> specifies the name of a ring followed by it's size 
    66#    in kilobytes, eg        Ring    WAVE_RING 1024 
    7 #    The maximum size of a ring depends on your operating system,  
    8 #    amount of physical RAM and configured virtual (paging) memory  
    9 #    available. A good place to start is 1024 kilobytes.  
    10 #    Ring names are listed in file earthworm.d. 
     7#    The maximum size of a ring is 1024 kilobytes. 
     8#    Ring names are listed in file earthworm.h. 
    119# 
    12 # refer to the wiki for how to change your specific system's shared memory 
    13 # size - if you encounter problems with large or too many rings, this is probably 
    14 # the issue. 
     10nRing              2 
     11Ring   WAVE_RING   8192           # Make it large enough for ~2 secs of data 
     12Ring STATUS_RING   128 
    1513 
     14MyModuleId         MOD_STARTSTOP  # Module Id for this program 
     15HeartbeatInt       15             # Heartbeat interval in seconds 
    1616 
    17  nRing               3 
    18  Ring   WAVE_RING 1024 
    19  Ring   PICK_RING 1024 
    20  Ring   HYPO_RING 1024 
    21 # 
    22  MyModuleId    MOD_STARTSTOP  # Module Id for this program 
    23  HeartbeatInt  50             # Heartbeat interval in seconds 
    24  MyClassName   OTHER             # For this program 
    25  MyPriority     0             # For this program 
    26  LogFile        1             # 1=write a log file to disk, 0=don't 
    27  KillDelay      30            # seconds to wait before killing modules on 
    28                               #  shutdown 
    29  HardKillDelay  5             # number of seconds to wait on hard shutdown 
    30                               #  for a child to respond to KILL signal 
    31                               #  If missing or 0, no KILL signal will be sent 
    32 #  maxStatusLineLen   80     # Uncomment to specify length of lines in status 
    33 # statmgrDelay          2     # Uncomment to specify the number of seconds 
    34                                         # to wait after starting statmgr  
    35                                         # default is 1 second 
     17# The next two are for Unix only - must be here 
     18MyClassName        OTHER          # For this program 
     19MyPriority         0              # For this program 
     20 
     21# The next one is for Windows only - must be here 
     22#MyPriorityClass    Normal         # For startstop 
     23 
     24LogFile            1              # 1=write a log file to disk, 0=don't, 
     25                                  # 2=write to module log but not stderr/stdout 
     26KillDelay          5              # Number of seconds to wait on shutdown 
     27                                  #  for a child process to self-terminate 
     28                                  #  before killing it 
     29 
     30# The next one is for Unix only - must be here 
     31HardKillDelay      5              # Wait this many more secs for procs to die 
     32                                  #  before really killing them 
     33 
     34# The next one is for Windows only - must be here 
     35#PipeName           myEWPipe       # Name of the startstop console pipe to use 
     36 
     37# Uncomment to specify the number of seconds to wait after starting statmgr 
     38#statmgrDelay       1              # default is 1 second 
    3639 
    3740# 
     41#    PriorityClass values: 
     42#       Idle            4 
     43#       Normal          9 forground, 7 background 
     44#       High            13 
     45#       RealTime        24 
    3846# 
    39  Process          "statmgr statmgr.d" 
    40  Class/Priority    OTHER 0 
     47#    ThreadPriority values: 
     48#       Lowest          PriorityClass - 2 
     49#       BelowNormal     PriorityClass - 1 
     50#       Normal          PriorityClass 
     51#       AboveNormal     PriorityClass + 1 
     52#       Highest         PriorityClass + 2 
     53#       TimeCritical    31 if PriorityClass is RealTime; 15 otherwise 
     54#       Idle            16 if PriorityClass is RealTime; 1 otherwise 
    4155# 
    42  Process          "tankplayer tankplayer.d" 
    43  Class/Priority    OTHER 0 
     56#    Display can be either NewConsole, NoNewConsole, or MinimizedConsole. 
    4457# 
    45 # Process          "coaxtoring coaxtoring.d" 
    46 # Class/Priority    OTHER 0 
     58#    If the command string required to start a process contains 
     59#    embedded blanks, it must be enclosed in double-quotes. 
     60#    Processes may be disabled by commenting them out. 
     61#    To comment out a line, preceed the line by #. 
    4762# 
    48  Process          "tankplayer tankplayer2.d" 
    49  Class/Priority    OTHER 0 
     63Process          "copystatus WAVE_RING STATUS_RING" 
     64Class/Priority    OTHER 0 
    5065# 
    51  Process          "pick_ew pick_ew.d" 
    52  Class/Priority    OTHER 0 
     66##Process          "statmgr statmgr.d" 
     67##Class/Priority    OTHER 0 
    5368# 
    54  Process          "binder_ew binder_ew.d" 
    55  Class/Priority    OTHER 0 
    56 # 
    57  Process          "eqproc eqproc.d" 
    58  Class/Priority    OTHER 0 
    59 # 
    60  Process          "diskmgr diskmgr.d" 
    61  Class/Priority    OTHER 0 
    62 # 
    63  Process          "copystatus WAVE_RING HYPO_RING" 
    64 # Class/Priority    OTHER 5 
    65  Class/Priority    OTHER 0 
    66 # 
    67  Process          "copystatus PICK_RING HYPO_RING" 
    68 # Class/Priority    OTHER 5 
    69  Class/Priority    OTHER 0 
    70 # 
    71  Process          "menlo_report menlo_report.d" 
    72  Class/Priority    OTHER 0 
    73  
     69Process          "maketrace maketrace.d" 
     70Class/Priority    OTHER 0 
  • branches/cosmos/params/statmgr.d

    r7373 r8041  
    1  
     1# 
    22#                    Status Manager Configuration File 
    33#                             (statmgr.d) 
     
    2020#   knows about will be checked for status messages. The above 
    2121#   single RingName, however, still needs to be a valid ring name. 
    22 #   If you use CheckAllRings, you don't want to use any  
     22#   If you use CheckAllRings, you don't want to use any 
    2323#   copystatus modules. Note statmgr may not be able to keep up 
    24 #   on a system with a very busy ring, and you may need to  
     24#   on a system with a very busy ring, and you may need to 
    2525#   set CheckAllRings to 0 and go back to the old way of using copystatus 
    2626#   Note this defaults to OFF if not set in the config file. 
     
    7979#     mail  <emailAddressN> 
    8080# 
    81 mail  earthworm-ops@your.org 
     81#mail  earthworm-ops@your.org 
    8282 
    8383# Mail program to use, e.g /usr/ucb/Mail (not required) 
     
    123123# 
    124124Descriptor  statmgr.desc 
    125 # Descriptor  adsend_a.desc        # Data source (adsend) on lardass 
    126 # Descriptor  adsend_b.desc        # Data source (adsend) on honker 
    127 # Descriptor  picker_a.desc        # Picker programs on redhot 
    128 # Descriptor  picker_b.desc        # Picker programs on redhot 
    129 # Descriptor  coaxtoring.desc 
    130 # Descriptor  diskmgr.desc 
    131 # Descriptor  binder.desc 
    132 # Descriptor  eqproc.desc 
    133125Descriptor  startstop.desc 
    134 # Descriptor  pagerfeeder.desc 
    135 # Descriptor  pick_client.desc 
    136 # Descriptor  pick_server.desc 
     126 
     127Descriptor  maketrace.desc 
  • branches/cosmos/params/statmgr.desc

    r6237 r8041  
    1  
     1# 
    22#             Descriptor File for the Status Manager Program 
    33# 
     
    2020#    <instId> is the installation id number as specified in the file 
    2121#    earthworm.h. 
    22 #   
     22# 
    2323#    Optional Parameters: 
    2424#    -------------------- 
     
    5050#    until the status manager is restarted. 
    5151# 
    52 tsec: 0  page: 0  mail: 0  
     52tsec: 0  page: 0  mail: 0 
    5353# 
    5454# 
     
    7171# 
    7272#    <text> is the default character string that will be reported. 
    73 #    Enclose string in double-quotes if it contains embedded  
     73#    Enclose string in double-quotes if it contains embedded 
    7474#    blanks. 
    7575#    Each module may also issue a text string for an error, 
  • branches/cosmos/params/wave_serverV.desc

    r7968 r8041  
    1 # 
     1 
    22#            Descriptor File for the wave_serverV module 
    33# 
  • branches/cosmos/release_notes.v7.10

    r7973 r8041  
    1 Release Notes:  Earthworm Version "working" 
    2  
    3 These notes are for release v7.10 released on March 19, 2019  
     1Release Notes:  Earthworm Version "7.10" 
     2 
     3These notes are for release v7.10 released on August 13, 2019  
    44 
    55Syntax for the release notes are still short and sweet, 3 lines:  
     
    183183samples that cannot be represented with 30 bits or less. 
    184184Chad Trabant March 14, 2019 
     185 
     186ew2moledb 
     187* preserve query when error "Lost connection to MySQL server during query" occurs. (Error code: 2013) 
     188* preserve query when error "MySQL server has gone away" occurs. (Error code: 2006) 
     189* fix precision to millisecond in datetime fields 
     190Matteo Quintiliani - May 28, 2019 
     191 
    185192 
    186193CHANGES TO CONFIGURATION FILES and DESCRIPTOR FILES: 
  • branches/cosmos/release_notes.working

    r7962 r8041  
    1717******************************************** 
    1818 
    19  
    2019CHANGES TO CONFIGURATION FILES and DESCRIPTOR FILES: 
    2120**************************************************** 
  • branches/cosmos/rpm/ew.centos.spec

    r7769 r8041  
    11%define name    earthworm 
    22%define version 7.10 
    3 %define release 1 
     3%define release 2 
    44%define ewhome "/opt/earthworm" 
    55%define version_dir %{ew_home}/%{name}_%{version} 
     
    1717BuildRequires: gcc-c++ 
    1818BuildRequires: gcc-gfortran 
     19Requires: libgfortran 
     20 
    1921%description 
    2022Earthworm provides users with an advanced open source seismic data acquisition and processing software 
  • branches/cosmos/src

  • branches/cosmos/src/archiving/archman/makefile.unix

    r7912 r8041  
    3333 
    3434clean/archman: PHONY 
    35         -$(RM) a.out core *.o *.obj *% *~ 
     35        -$(RM) a.out core *.o *.obj *% *~ \ 
     36        $(RM) lib/a.out lib/core lib/*.o lib/*.obj lib/*% lib/*~ lib/*.a  
    3637 
    3738clean/libbgs: PHONY 
  • branches/cosmos/src/archiving/mole/HISTORY

    r5887 r8041  
    33######################### 
    44 
    5 * Release 1.2    (2013/08/22)  
     5* Release 1.2.1    (2018/05/28)  
     6 
     7      moledb    1.2.4 2013-08-22 
     8      ew2moledb 1.2.7 2019-05-28 
     9      moleface  1.2.5 2013-08-22  
     10 
     11  CHANGES: 
     12    - ew2moledb: 
     13       * preserve query when error "Lost connection to MySQL server during query" occurs. (Error code: 2013) 
     14       * preserve query when error "MySQL server has gone away" occurs. (Error code: 2006) 
     15       * fix precision to millisecond in datetime fields 
     16 
     17------------------------------------------------------------------------------ 
     18 
     19* Release 1.2.0    (2013/08/22)  
    620 
    721      moledb    1.2.4 2013-08-22  
  • branches/cosmos/src/archiving/mole/VERSION

    r5887 r8041  
    1 moledb    1.2.4 2013-08-22  
    2 ew2moledb 1.2.3 2013-07-29  
     1moledb    1.2.4 2013-08-22 
     2ew2moledb 1.2.7 2019-05-28 
    33moleface  1.2.5 2013-08-22  
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb.c

    r7775 r8041  
    1 #include <errno.h> 
    2 #include <signal.h> 
    31#include <stdio.h> 
    42#include <stdlib.h> 
     
    64#include <time.h> 
    75 
    8 #include "earthworm.h" 
    9 #include "time_ew.h" 
    10 #include "kom.h" 
    11 #include "transport.h" 
    12 #include "mem_circ_queue.h"  
     6#include <time_ew.h> 
     7#include <errno.h> 
     8#include <signal.h> 
     9#include <earthworm.h> 
     10#include <kom.h> 
     11#include <transport.h> 
     12#include <mem_circ_queue.h>  
    1313 
    1414#include "ew2moledb_version.h" 
     
    3737DECLARE_SPECIFIC_SEMAPHORE_EW(sema_CountToProcess); 
    3838 
     39 /* just to compile without warning from thread function returning */ 
     40#ifdef _WINNT 
     41#define RETURN_THREAD_FUNCTION return 
     42#else 
     43#define RETURN_THREAD_FUNCTION return (thr_ret) NULL 
     44#endif 
     45 
    3946thr_ret MessageStacker( void *p );    /* thread: messages from ring to queue */ 
    4047thr_ret DBPopulate( void *p );        /* thread: messages from queue to database */ 
     
    112119void ew2moledb_lookup( TYPE_PARAMS *params ); 
    113120void ew2moledb_status( MSG_LOGO *logo, char *msg, TYPE_PARAMS *params); 
    114 void ew2moledb_mysql_status(int ret_ex_mysql_query, TYPE_PARAMS *params); 
     121void ew2moledb_mysql_status(int ret_ex_mysql_query, TYPE_PARAMS *params, int flag_sql_discard); 
    115122 
    116123/* Error messages used by ew2moledb  
     
    125132 
    126133int main( int argc, char **argv ) { 
    127     time_t              now;                     /* current time, used for timing heartbeats */ 
    128     pid_t               MyPid;                   /* Our own pid, sent with heartbeat for restart purposes */ 
    129     time_t              MyLastBeat;             /* time of last local (into Earthworm) hearbeat */ 
    130     ew_thread_t     tidStacker[MAX_NUM_OF_RINGS];   /* Thread moving messages from transport to queue */ 
    131     ew_thread_t     tidDBPopulate;          /* Thread read message from queue and populate DB */ 
    132     ew_thread_t     tidQueueDumpFile;       /* Thread read message from queue and populate DB */ 
    133     int                 ret_dq;                 /* stores errors from dumpqueue() and undumpqueue() */ 
    134     int                 cur_NumOfElements = 0;  /* Current value of number of elements in OutQueue */ 
    135     const int           wait_time_thr_tot   = 5000;  /* total of waiting time for joining all threads */ 
    136     const int           wait_time_thr_slice = wait_time_thr_tot / 10;   /* slice of waiting time for joining all threads */ 
    137     int                 wait_time_thr_count = 0;     /* counter of waiting time for joining all threads */ 
    138     char                errText[STR_LEN_ERRTEXT];  /* string for log/error/heartbeat messages           */ 
    139     char                *configfile;       /* pointer to configuration file name argv[1] */  
    140     MYSQL               *test_mysql_connection = NULL; 
     134    time_t       now;                    /* current time, used for timing heartbeats */ 
     135    pid_t        MyPid;                  /* Our own pid, sent with heartbeat for restart purposes */ 
     136    time_t       MyLastBeat;             /* time of last local (into Earthworm) hearbeat */ 
     137    unsigned     tidStacker[MAX_NUM_OF_RINGS];   /* Thread moving messages from transport to queue */ 
     138    unsigned     tidDBPopulate;          /* Thread read message from queue and populate DB */ 
     139    unsigned     tidQueueDumpFile;       /* Thread read message from queue and populate DB */ 
     140    int          ret_dq;                 /* stores errors from dumpqueue() and undumpqueue() */ 
     141    int          cur_NumOfElements = 0;  /* Current value of number of elements in OutQueue */ 
     142    const int    wait_time_thr_tot   = 5000;  /* total of waiting time for joining all threads */ 
     143    const int    wait_time_thr_slice = wait_time_thr_tot / 10;   /* slice of waiting time for joining all threads */ 
     144    int          wait_time_thr_count = 0;     /* counter of waiting time for joining all threads */ 
     145    char         errText[STR_LEN_ERRTEXT];  /* string for log/error/heartbeat messages           */ 
     146    char         *configfile;       /* pointer to configuration file name argv[1] */  
     147    MYSQL        *test_mysql_connection = NULL; 
    141148 
    142149    int          r = 0; 
     
    518525    char    *iter_sqlstr = NULL; 
    519526    char    *sub_sqlstr = NULL; 
    520     int     ret_ex_mysql_query = EW2MOLEDB_OK; 
     527    int     ret_ex_mysql_query = EW2MOLEDB_MYSQL_OK; 
    521528    MYSQL   *mysql = NULL; 
    522529    char    *Wrmsg = NULL;           /* message to get from queue         */ 
     
    525532    int count_sql_err_conndb = 0; 
    526533    int count_sql_err_exquery = 0; 
    527     int count_sql_err_generic = 0; 
    528534    int flag_remove_last_msg = 0; 
     535    int flag_sql_discard = 0; 
     536    int flag_sql_retry_last = 0; 
     537    int count_sql_exec_attempt = 1; 
     538    const int max_sql_exec_attempts = 3; 
     539#define MYSTATE_NO_ERR 0 
     540    /* Unlimited attempts */ 
     541#define MYSTATE_ERR_DB_CONNECTION 1 
     542    /* Limited attempts */ 
     543#define MYSTATE_ERR_LIMITED_ATTEMPTS 2 
     544    /* No attempts */ 
     545#define MYSTATE_ERR_NO_ATTEMPTS 3 
     546    int state_mysql_error_handling = MYSTATE_NO_ERR; 
    529547 
    530548    logit( "t", "ew2moledb: thread DBPopulate() started.\n"); 
     
    637655            count_sql_err_conndb = 0; 
    638656            count_sql_err_exquery = 0; 
    639             count_sql_err_generic = 0; 
     657            flag_sql_retry_last = 0; 
     658            count_sql_exec_attempt = 1; 
     659 
     660            state_mysql_error_handling = MYSTATE_NO_ERR; 
    640661 
    641662            iter_sqlstr = sqlstr; 
    642663            while(iter_sqlstr != NULL) { 
    643                 count_sql_tot++; 
    644                 sub_sqlstr = sub_strpos(&iter_sqlstr, ';'); 
     664 
     665                /* Read a new sql string */ 
     666                if(!flag_sql_retry_last) { 
     667                    count_sql_tot++; 
     668                    sub_sqlstr = sub_strpos(&iter_sqlstr, ';'); 
     669                    count_sql_exec_attempt = 1; 
     670                } else { 
     671                    count_sql_exec_attempt++; 
     672                } 
    645673                logit("t", "DEBUG: sub_sqlstr=\"%s\"\n", sub_sqlstr); 
     674 
     675                flag_sql_retry_last = 0; 
    646676                if( (ret_ex_mysql_query = ew2moledb_mysql_query_p(&mysql, sub_sqlstr, 
    647                                 params->db_hostname, params->db_username, params->db_password, params->db_name, params->db_port)) == EW2MOLEDB_OK) { 
     677                                params->db_hostname, params->db_username, params->db_password, params->db_name, params->db_port)) == EW2MOLEDB_MYSQL_OK) { 
    648678 
    649679                    /* sqlstr can contain more than one query! */ 
     
    655685                    /* Count error types */ 
    656686                    switch(ret_ex_mysql_query) { 
    657                         case EW2MOLEDB_ERR_CONNDB: 
     687                        case EW2MOLEDB_MYSQL_ERR_CONNDB: 
     688                        case CR_SERVER_GONE_ERROR:   // MySQL error number 2006 
     689                        case CR_SERVER_LOST:         // MySQL error number 2013 
    658690                            count_sql_err_conndb++; 
     691                            state_mysql_error_handling = MYSTATE_ERR_DB_CONNECTION; 
     692                            flag_sql_discard = 0; 
     693                            flag_sql_retry_last = 1; 
    659694                            break; 
    660                         case EW2MOLEDB_ERR_EXQUERY: 
    661                             count_sql_err_exquery++; 
     695                        case ER_LOCK_WAIT_TIMEOUT: 
     696                            state_mysql_error_handling = MYSTATE_ERR_LIMITED_ATTEMPTS; 
     697                            flag_sql_discard = 0; 
     698                            flag_sql_retry_last = 1; 
    662699                            break; 
    663700                        default: 
    664                             count_sql_err_generic++; 
     701                            state_mysql_error_handling = MYSTATE_ERR_NO_ATTEMPTS; 
     702                            count_sql_err_exquery++; 
     703                            flag_sql_discard = 1; 
    665704                            break; 
    666705                    } 
    667706 
     707                    /* If it exceeds max sql attempts then sql is discaded */ 
     708                    if(count_sql_exec_attempt >= max_sql_exec_attempts) { 
     709                      flag_sql_retry_last = 0; 
     710                      flag_sql_discard = 1; 
     711                    } 
     712 
    668713                    /* Report error on ring by ew2moledb_status() */ 
    669                     ew2moledb_mysql_status(ret_ex_mysql_query, params); 
     714                    ew2moledb_mysql_status(ret_ex_mysql_query, params, flag_sql_discard); 
    670715 
    671716                    /* Wait a while after a DB error */ 
     
    721766    setlck_flags_term(FLAG_TERM_THR_DB); 
    722767    KillSelfThread(); /* main thread will not restart us */ 
    723     return THR_NULL_RET; 
     768    RETURN_THREAD_FUNCTION; 
    724769} 
    725770 
     
    898943    dec_nStackerThread(); 
    899944    KillSelfThread(); /* main thread will not restart us */ 
    900     return THR_NULL_RET; 
     945    RETURN_THREAD_FUNCTION; 
    901946} 
    902947 
     
    10001045    setlck_flags_term(FLAG_TERM_THR_QF); 
    10011046    KillSelfThread(); /* main thread will not restart us */ 
    1002     return THR_NULL_RET; 
     1047    RETURN_THREAD_FUNCTION; 
    10031048} 
    10041049 
     
    14181463/*************************************************************************** 
    14191464 * ew2moledb_mysql_status()                                                * 
    1420  *    If ret_ex_mysql_query is not equal to EW2MOLEDB_OK then report error * 
     1465 *    If ret_ex_mysql_query is not equal to EW2MOLEDB_MYSQL_OK then report error * 
    14211466 *    message on ring by ew2moledb_status().                               * 
    14221467 ***************************************************************************/ 
    1423 void ew2moledb_mysql_status(int ret_ex_mysql_query, TYPE_PARAMS *params) { 
     1468void ew2moledb_mysql_status(int ret_ex_mysql_query, TYPE_PARAMS *params, int flag_sql_discard) { 
    14241469  time_t   now; /* current time, used for error messages */ 
    14251470  char    errText[STR_LEN_ERRTEXT]; 
     
    14281473  errText[STR_LEN_ERRTEXT-1]=0; 
    14291474 
    1430   if(ret_ex_mysql_query != EW2MOLEDB_OK) { 
     1475  if(ret_ex_mysql_query != EW2MOLEDB_MYSQL_OK) { 
    14311476    time(&now); 
    1432     switch(ret_ex_mysql_query) { 
    1433       case EW2MOLEDB_ERR_CONNDB: 
    1434         snprintf( errText, STR_LEN_ERRTEXT-1, "%ld %hd %s Error connecting to %s:%ld.", now, 0, params->MyModName, params->db_hostname, params->db_port); 
    1435         break; 
    1436       case EW2MOLEDB_ERR_EXQUERY: 
    1437         snprintf( errText, STR_LEN_ERRTEXT-1, "%ld %hd %s Error executing query for %s:%ld.", now, 0, params->MyModName, params->db_hostname, params->db_port); 
    1438         break; 
    1439       default: 
    1440         snprintf( errText, STR_LEN_ERRTEXT-1, "%ld %hd %s Error generic for %s:%ld.", now, 0, params->MyModName, params->db_hostname, params->db_port); 
    1441         break; 
    1442     } 
     1477    snprintf( errText, STR_LEN_ERRTEXT-1, "%ld %hd %s Error executing query on %s:%ld. (MySQL error %d). Query %s.", now, 0, params->MyModName, params->db_hostname, params->db_port, ret_ex_mysql_query, (flag_sql_discard)? "has been discarded" : "will be re-executed"); 
    14431478    ew2moledb_status( &params->ErrorLogo, errText, params ); 
    14441479  } 
     1480 
    14451481} 
    14461482 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb.desc

    r6237 r8041  
    2626modName  ew2moledb  
    2727modId    MOD_EW2MOLEDB 
    28 instId   ${EW_INST_ID} 
     28instId   ${EW_INSTALLATION} 
    2929# 
    3030# 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_arc.c

    r5546 r8041  
    302302    char mysqlstr_datetime_cdate[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
    303303    char ingv_quality1, ingv_quality2; 
     304    const int pick_second_precision = 3; 
    304305 
    305306    int i; 
     
    357358    for(i=0; i < n_arcPck; i++) { 
    358359 
    359         epoch_to_mysql_datetime_str(mysqlstr_datetime_Pat, EW2MOLEDB_DATETIME_MAXLEN_STR, arcPck[i].Pat - GSEC1970); 
    360         epoch_to_mysql_datetime_str(mysqlstr_datetime_Sat, EW2MOLEDB_DATETIME_MAXLEN_STR, arcPck[i].Sat - GSEC1970); 
     360        epoch_to_mysql_datetime_str(mysqlstr_datetime_Pat, EW2MOLEDB_DATETIME_MAXLEN_STR, arcPck[i].Pat - GSEC1970, pick_second_precision); 
     361        epoch_to_mysql_datetime_str(mysqlstr_datetime_Sat, EW2MOLEDB_DATETIME_MAXLEN_STR, arcPck[i].Sat - GSEC1970, pick_second_precision); 
    361362        timestr_to_mysql_datetime_str(mysqlstr_datetime_cdate, arcPck[i].cdate); 
    362363 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_eb_hypotwc.c

    r5547 r8041  
    2525  static char sqlstr[MAX_SQLSTR_HYPOTWC]; 
    2626  char mysqlstr_datetime_dOriginTime[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
     27  const int ot_second_precision = 3; 
    2728 
    2829  sqlstr[MAX_SQLSTR_HYPOTWC - 1] = 0; 
    2930 
    30   epoch_to_mysql_datetime_str(mysqlstr_datetime_dOriginTime, EW2MOLEDB_DATETIME_MAXLEN_STR, HypoTWC->dOriginTime); 
     31  epoch_to_mysql_datetime_str(mysqlstr_datetime_dOriginTime, EW2MOLEDB_DATETIME_MAXLEN_STR, HypoTWC->dOriginTime, ot_second_precision); 
    3132 
    3233  snprintf(sqlstr, MAX_SQLSTR_HYPOTWC - 1, 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_eb_picktwc.c

    r5546 r8041  
    2828  char mysqlstr_datetime_dMlTime[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
    2929  char mysqlstr_datetime_dMSTime[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
     30  const int pick_second_precision = 3; 
    3031 
    3132  sqlstr[MAX_SQLSTR_PICKTWC - 1] = 0; 
    3233 
    33   epoch_to_mysql_datetime_str(mysqlstr_datetime_dPTime, EW2MOLEDB_DATETIME_MAXLEN_STR, Station->dPTime); 
    34   epoch_to_mysql_datetime_str(mysqlstr_datetime_dMbTime, EW2MOLEDB_DATETIME_MAXLEN_STR, Station->dMbTime); 
    35   epoch_to_mysql_datetime_str(mysqlstr_datetime_dMlTime, EW2MOLEDB_DATETIME_MAXLEN_STR, Station->dMlTime); 
    36   epoch_to_mysql_datetime_str(mysqlstr_datetime_dMSTime, EW2MOLEDB_DATETIME_MAXLEN_STR, Station->dMSTime); 
     34  epoch_to_mysql_datetime_str(mysqlstr_datetime_dPTime, EW2MOLEDB_DATETIME_MAXLEN_STR, Station->dPTime, pick_second_precision); 
     35  epoch_to_mysql_datetime_str(mysqlstr_datetime_dMbTime, EW2MOLEDB_DATETIME_MAXLEN_STR, Station->dMbTime, pick_second_precision); 
     36  epoch_to_mysql_datetime_str(mysqlstr_datetime_dMlTime, EW2MOLEDB_DATETIME_MAXLEN_STR, Station->dMlTime, pick_second_precision); 
     37  epoch_to_mysql_datetime_str(mysqlstr_datetime_dMSTime, EW2MOLEDB_DATETIME_MAXLEN_STR, Station->dMSTime, pick_second_precision); 
    3738 
    3839  /************************************************** 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_error.c

    r5546 r8041  
    1414    int l = msg_size; 
    1515    int i; 
     16    const int err_second_precision = 3; 
    1617 
    1718    sqlstr[EW2MOLEDB_MAXLEN_ERROR_MSG - 1] = 0; 
    1819 
    1920    sscanf(msg, "%ld", &time_error); 
    20     epoch_to_mysql_datetime_str(mysqlstr_datetime_error, EW2MOLEDB_DATETIME_MAXLEN_STR, time_error); 
     21    epoch_to_mysql_datetime_str(mysqlstr_datetime_error, EW2MOLEDB_DATETIME_MAXLEN_STR, time_error, err_second_precision); 
    2122 
    2223    while(l>0 && *p != ' ' && *p != 0) { 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_heartbeat.c

    r5546 r8041  
    1212    char mysqlstr_datetime_heartbeat[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
    1313    long pid; 
     14    const int heartbeat_second_precision = 3; 
    1415 
    1516    sqlstr[EW2MOLEDB_MAXLEN_HEARTBEAT_MSG - 1] = 0; 
    1617 
    1718    sscanf(msg, "%ld %ld", &time_heartbeat, &pid); 
    18     epoch_to_mysql_datetime_str(mysqlstr_datetime_heartbeat, EW2MOLEDB_DATETIME_MAXLEN_STR, time_heartbeat); 
     19    epoch_to_mysql_datetime_str(mysqlstr_datetime_heartbeat, EW2MOLEDB_DATETIME_MAXLEN_STR, time_heartbeat, heartbeat_second_precision); 
    1920 
    2021    snprintf(sqlstr, EW2MOLEDB_MAXLEN_HEARTBEAT_MSG - 1, "CALL sp_ins_ew_heartbeat('%s', '%s', '%s', %ld);", 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_magnitude.c

    r5546 r8041  
    137137    char ingv_mag_quality2; 
    138138    int i; 
     139    const int mag_phase_second_precision = 3; 
    139140 
    140141    sqlstr[MAX_SQLSTR_MAGNITUDE - 1] = 0; 
     
    166167    for(i=0; i < magSum->nchannels; i++) { 
    167168 
    168         epoch_to_mysql_datetime_str(mysqlstr_datetime_Time1, EW2MOLEDB_DATETIME_MAXLEN_STR, magChan[i].Time1); 
    169         epoch_to_mysql_datetime_str(mysqlstr_datetime_Time2, EW2MOLEDB_DATETIME_MAXLEN_STR, magChan[i].Time2); 
     169        epoch_to_mysql_datetime_str(mysqlstr_datetime_Time1, EW2MOLEDB_DATETIME_MAXLEN_STR, magChan[i].Time1, mag_phase_second_precision); 
     170        epoch_to_mysql_datetime_str(mysqlstr_datetime_Time2, EW2MOLEDB_DATETIME_MAXLEN_STR, magChan[i].Time2, mag_phase_second_precision); 
    170171 
    171172        snprintf(sqlstr_tmp, MAX_SQLSTR_TMP - 1, "CALL sp_ins_ew_magnitude_phase('%s', '%s', %s, %u, '%s', '%s', '%s', '%s', %lf, %lf, %lf, '%s', %f, %f, '%s', %f, %f);", 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_mysql.c

    r5546 r8041  
    5555 
    5656    out_str[22] = '0'; 
    57     out_str[23] = '0'; 
    58     out_str[24] = '0'; 
    59     out_str[25] = '0'; 
    60  
    61     out_str[26] = 0; 
    62  
    63 } 
    64  
    65 int epoch_to_mysql_datetime_str(char *out_str, int len_out_str, double time_d) { 
     57 
     58    out_str[23] = 0; 
     59 
     60} 
     61 
     62int epoch_to_mysql_datetime_str(char *out_str, int len_out_str, double time_d, int second_precision) { 
     63    /* possible values for second_precision from 1 to 6 */ 
     64 
    6665    time_t time_t_start_time; 
    6766    struct tm *tm_start_time; 
     67    char out_str_decimal[128]; 
     68    char fmt_str_decimal[128]; 
    6869    double integral; 
     70    const int second_precision_default = 6; 
     71 
     72    /* if second_precision is out of range then set default 6 */ 
     73    if(second_precision < 1 || second_precision > 6) { 
     74            logit("et", "Warning epoch_to_mysql_datetime_str(), second_precision set default %d.\n", second_precision_default); 
     75            second_precision = second_precision_default; 
     76    } 
    6977 
    7078    out_str[len_out_str - 1] = 0; 
     79    out_str_decimal[128 - 1] = 0; 
    7180 
    7281    if(time_d > 0.0) { 
     
    7786    tm_start_time = gmtime(&time_t_start_time); 
    7887 
    79     snprintf(out_str, len_out_str - 1, "%04d-%02d-%02d %02d:%02d:%02d.%06ld", 
     88    snprintf(fmt_str_decimal, 128 - 1, ".%%0%dld", second_precision); 
     89    snprintf(out_str_decimal, 128 - 1, fmt_str_decimal, 
     90                    (long) ( (modf(time_d, &integral) * pow(10.0, second_precision)) + 0.5) 
     91            ); 
     92 
     93    snprintf(out_str, len_out_str - 1, "%04d-%02d-%02d %02d:%02d:%02d%s", 
    8094            tm_start_time->tm_year + 1900, 
    8195            tm_start_time->tm_mon + 1, 
     
    87101            tm_start_time->tm_min, 
    88102            tm_start_time->tm_sec, 
    89             (long) ( (modf(time_d, &integral) * 1000000.0) + 0.5) 
     103            out_str_decimal 
    90104           ); 
    91105     
     
    240254 
    241255int ew2moledb_mysql_query(char *query, char *hostname, char *username, char *password, char *dbname, long dbport) { 
    242     int ret = EW2MOLEDB_OK; 
     256    int ret = EW2MOLEDB_MYSQL_OK; 
    243257 
    244258    MYSQL *mysql; 
     
    260274            ew2moledb_mysql_free_result(res); 
    261275        } else { 
    262             ret = EW2MOLEDB_ERR_EXQUERY; 
     276            ret = mysql_errno(mysql); 
    263277        } 
    264278 
     
    266280        ew2moledb_mysql_close(mysql); 
    267281    } else { 
    268         ret = EW2MOLEDB_ERR_CONNDB; 
     282        ret = EW2MOLEDB_MYSQL_ERR_CONNDB; 
    269283    } 
    270284 
     
    323337                logit("e", "Error mysql_real_query(): %d '%s' '%s' in query:\n'%s'\n", 
    324338                        mysql_errno(mysql), mysql_error(mysql), mysql_sqlstate(mysql), query); 
    325                 ret = -1; 
     339                ret = mysql_errno(mysql); 
    326340    } 
    327341 
     
    380394 
    381395int ew2moledb_mysql_query_p(MYSQL **pmysql, char *query, char *hostname, char *username, char *password, char *dbname, long dbport) { 
    382     int ret = EW2MOLEDB_OK; 
    383  
    384     int err_query = 0; 
     396    int ret = 0; 
    385397 
    386398    if(flag_debug_mysql) { 
     
    393405    if(*pmysql) { 
    394406        /* Execute query */ 
    395         err_query = ew2moledb_mysql_only_query_p(*pmysql, query); 
    396  
    397         if(err_query == 0) { 
     407        ret = ew2moledb_mysql_only_query_p(*pmysql, query); 
     408 
     409        if(ret == 0) { 
    398410            /* Consume and free result */ 
    399411            /* ew2moledb_mysql_consume_result(res); */ 
     
    401413            ew2moledb_mysql_free_results(*pmysql); 
    402414        } else { 
    403             ret = EW2MOLEDB_ERR_EXQUERY; 
    404  
    405415            /* Free struct pmysql */ 
    406416            ew2moledb_mysql_close_p(pmysql); 
     
    410420 
    411421    } else { 
    412         ret = EW2MOLEDB_ERR_CONNDB; 
     422        ret = EW2MOLEDB_MYSQL_ERR_CONNDB; 
    413423    } 
    414424 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_mysql.h

    r5546 r8041  
    33 
    44#include <mysql.h> 
     5#include <errmsg.h> 
     6#include <mysqld_error.h> 
    57 
    6 #define EW2MOLEDB_OK 0 
    7 #define EW2MOLEDB_ERR_CONNDB -1 
    8 #define EW2MOLEDB_ERR_EXQUERY -2 
     8/* EW2MOLEDB_MYSQL_OK must be zero */ 
     9#define EW2MOLEDB_MYSQL_OK 0 
     10/* EW2MOLEDB_MYSQL_ERR_CONNDB must be a negative number not equal to value returned by mysql_errno() */ 
     11#define EW2MOLEDB_MYSQL_ERR_CONNDB -99999 
    912 
    1013#ifdef _WINNT 
     
    1720extern int flag_debug_mysql; 
    1821 
    19 int epoch_to_mysql_datetime_str(char *out_str, int len_out_str, double time_d); 
     22int epoch_to_mysql_datetime_str(char *out_str, int len_out_str, double time_d, int second_precision); 
    2023void timestr_to_mysql_datetime_str(char out_str[EW2MOLEDB_DATETIME_MAXLEN_STR], char *in_str); 
    2124 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_pickcoda.c

    r5546 r8041  
    2020    char *instid_name; 
    2121 
     22    const int pick_second_precision = 3; 
     23 
    2224    subject[MAX_SUBJECT_LEN - 1] = 0; 
    2325    mail_msg_body[MAIL_MSG_BODY_SIZE - 1] = 0; 
     
    2729    instid_name = GetInstName(pick->instid); 
    2830 
    29     epoch_to_mysql_datetime_str(tpick_mysql_datetime, EW2MOLEDB_DATETIME_MAXLEN_STR, pick->tpick); 
     31    epoch_to_mysql_datetime_str(tpick_mysql_datetime, EW2MOLEDB_DATETIME_MAXLEN_STR, pick->tpick, pick_second_precision); 
    3032 
    3133    /* 
     
    7880    static char sqlstr[MAX_SQLSTR_PICKCODA]; 
    7981    char tpick_mysql_datetime[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
     82    const int pick_second_precision = 3; 
    8083 
    8184    /* 
     
    9194    sqlstr[MAX_SQLSTR_PICKCODA - 1] = 0; 
    9295 
    93     epoch_to_mysql_datetime_str(tpick_mysql_datetime, EW2MOLEDB_DATETIME_MAXLEN_STR, pick->tpick); 
     96    epoch_to_mysql_datetime_str(tpick_mysql_datetime, EW2MOLEDB_DATETIME_MAXLEN_STR, pick->tpick, pick_second_precision); 
    9497 
    9598    snprintf(sqlstr, MAX_SQLSTR_PICKCODA - 1, "CALL sp_ins_ew_pick_scnl('%s', '%s', %d, '%s', '%s', '%s', '%s', '%c', %c, '%s', %ld, %ld, %ld);", 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_strongmotionII.c

    r5546 r8041  
    2222    char mysqlstr_datetime_tpgv[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
    2323    char mysqlstr_datetime_tpgd[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
     24    const int strongmotion_second_precision = 3; 
    2425 
    2526    /* TODO version */ 
     
    4243    } 
    4344 
    44     epoch_to_mysql_datetime_str(mysqlstr_datetime_t, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->t); 
    45     epoch_to_mysql_datetime_str(mysqlstr_datetime_talt, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->talt); 
     45    epoch_to_mysql_datetime_str(mysqlstr_datetime_t, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->t, strongmotion_second_precision); 
     46    epoch_to_mysql_datetime_str(mysqlstr_datetime_talt, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->talt, strongmotion_second_precision); 
    4647 
    47     epoch_to_mysql_datetime_str(mysqlstr_datetime_tpga, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->tpga); 
    48     epoch_to_mysql_datetime_str(mysqlstr_datetime_tpgv, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->tpgv); 
    49     epoch_to_mysql_datetime_str(mysqlstr_datetime_tpgd, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->tpgd); 
     48    epoch_to_mysql_datetime_str(mysqlstr_datetime_tpga, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->tpga, strongmotion_second_precision); 
     49    epoch_to_mysql_datetime_str(mysqlstr_datetime_tpgv, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->tpgv, strongmotion_second_precision); 
     50    epoch_to_mysql_datetime_str(mysqlstr_datetime_tpgd, EW2MOLEDB_DATETIME_MAXLEN_STR, strongmotionII_msg->tpgd, strongmotion_second_precision); 
    5051 
    5152    snprintf(sqlstr, MAX_SQLSTR_STRONGMOTIONII - 1, "CALL sp_ins_ew_strongmotionII('%s', '%s', %s, '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %lf, '%s', %lf, '%s', %lf, '%s', '%s');", 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_tracebuf.c

    r5546 r8041  
    1414    char wst_mysql_datetime[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
    1515    char wet_mysql_datetime[EW2MOLEDB_DATETIME_MAXLEN_STR]; 
     16    const int tracebuf_second_precision = 3; 
    1617 
    1718    /* 
     
    2728    sqlstr[MAX_SQLSTR_TRACEBUF - 1] = 0; 
    2829 
    29     epoch_to_mysql_datetime_str(wst_mysql_datetime, EW2MOLEDB_DATETIME_MAXLEN_STR, trh->starttime); 
    30     epoch_to_mysql_datetime_str(wet_mysql_datetime, EW2MOLEDB_DATETIME_MAXLEN_STR, trh->endtime); 
     30    epoch_to_mysql_datetime_str(wst_mysql_datetime, EW2MOLEDB_DATETIME_MAXLEN_STR, trh->starttime, tracebuf_second_precision); 
     31    epoch_to_mysql_datetime_str(wet_mysql_datetime, EW2MOLEDB_DATETIME_MAXLEN_STR, trh->endtime, tracebuf_second_precision); 
    3132 
    3233    snprintf(sqlstr, MAX_SQLSTR_TRACEBUF - 1, "CALL sp_ins_ew_tracebuf('%s', '%s', %d, %d, '%s', '%s', %f, '%s', '%s', '%s', '%s', '%d-%d', '%s', '%d-%d');", 
  • branches/cosmos/src/archiving/mole/ew2moledb/ew2moledb_version.h

    r5688 r8041  
    11/* DO NOT EDIT. Automatically generated. Change file VERSION in mole main directory. */ 
    2 #define EW2MOLEDB_VERSION "1.2.3 - 2013-07-29" 
     2#define EW2MOLEDB_VERSION "1.2.7 - 2019-05-28" 
  • branches/cosmos/src/archiving/mole/ew2moledb/makefile.nt

    r7957 r8041  
    1 !IF "$(EW_DEBUG)" == "1" 
    2 !ELSE 
    3 NODEBUG = 1 
    4 !ENDIF 
     1# 
     2#    Nmake File For ew2moledb - Windows version 
     3#  
    54 
    6 !include <Win32.Mak> 
     5NODEBUG=1 
    76 
    8 CFLAGS  = $(cflags)    $(cdebug) $(cvarsmt)   $(GLOBALFLAGS) \ 
    9         /I..\mysql-connector-c-6.0.2\include 
    10 LDFLAGS = $(conlflags) $(ldebug) $(conlibsmt) 
     7!include <ntwin32.mak> 
     8 
     9APP = ew2moledb 
     10O = $(APP).obj ew2moledb.obj ew2moledb_tracebuf.obj ew2moledb_pickcoda.obj ew2moledb_quakelink.obj  ew2moledb_strongmotionII.obj ew2moledb_magnitude.obj ew2moledb_arc.obj ew2moledb_sendmail.obj ew2moledb_mysql.obj ew2moledb_error.obj ew2moledb_eb_hypotwc.obj ew2moledb_eb_picktwc.obj ew2moledb_eb_alarm.obj ew2moledb_heartbeat.obj 
     11 
     12 
     13# Add the proper path for MySQL library 
     14MYSQLCLIENTLIB = ../mysql-connector-c-build/lib/mysqlclient.lib 
    1115 
    1216B = $(EW_HOME)\$(EW_VERSION)\bin 
    1317L = $(EW_HOME)\$(EW_VERSION)\lib 
    1418 
    15 APP = ew2moledb 
     19all: $B\$(APP).exe 
    1620 
    17 OBJS = \ 
    18         $(APP).obj \ 
    19         ew2moledb_arc.obj \ 
    20         ew2moledb_eb_alarm.obj \ 
    21         ew2moledb_eb_hypotwc.obj \ 
    22         ew2moledb_eb_picktwc.obj \ 
    23         ew2moledb_error.obj \ 
    24         ew2moledb_heartbeat.obj \ 
    25         ew2moledb_magnitude.obj \ 
    26         ew2moledb_mysql.obj \ 
    27         ew2moledb_pickcoda.obj \ 
    28         ew2moledb_quakelink.obj \ 
    29         ew2moledb_sendmail.obj \ 
    30         ew2moledb_strongmotionII.obj \ 
    31         ew2moledb_tracebuf.obj 
     21$B\$(APP).exe: $O 
     22    $(link) $(conlflags) $(ldebug) $(conlibsmt) $O \ 
     23        $L/read_arc.obj $L/rw_mag.obj $L/rw_strongmotionII.obj $L/rdpickcoda.obj $L/sendmail.obj \ 
     24        $L/mem_circ_queue.obj $L/swap.obj \ 
     25        $L/getsysname_ew.obj \ 
     26        $L/libew_mt.lib $L/sema_ew.obj  $L/dirops_ew.obj \ 
     27        $L/libebpick.lib $L/libebloc.lib \ 
     28        $(MYSQLCLIENTLIB) \ 
     29        -out:$B\$(APP).exe 
    3230 
    33 EW_LIBS = \ 
    34         /LIBPATH:$L \ 
    35         dirops_ew.obj \ 
    36         getsysname_ew.obj \ 
    37         mem_circ_queue.obj \ 
    38         rdpickcoda.obj \ 
    39         read_arc.obj \ 
    40         rw_mag.obj \ 
    41         rw_strongmotionII.obj \ 
    42         sema_ew.obj \ 
    43         sendmail.obj \ 
    44         swap.obj \ 
    45         libebloc.lib \ 
    46         libebpick.lib \ 
    47         libew_mt.lib 
     31.c.obj: 
     32        $(CC) $(GLOBALFLAGS)  /nologo $(cflags) $(cdebug) $(cvarsmt) $(tflags) $< 
     33    
    4834 
    49 # Add the proper path for MySQL library 
    50 MYSQLCLIENTLIB = ../mysql-connector-c-build/lib/mysqlclient.lib 
    51  
    52 $B\$(APP).exe: $(OBJS) 
    53         $(link) /out:$@ $(LDFLAGS) $(OBJS) $(MYSQLCLIENTLIB) $(EW_LIBS) 
    54  
    55  
    56 # Clean-up rules 
    57 clean: PHONY 
     35# Clean-up directives 
     36clean: 
    5837        -del a.out core *.o *.obj 
    5938 
    60 clean_bin: PHONY 
    61         -del $B\$(APP) $B\$(APP).exe 
     39clean_bin: 
     40        -del $B\$(APP).exe 
    6241 
    63 PHONY: 
  • branches/cosmos/src/archiving/mole/ew2moledb/makefile.unix

    r7912 r8041  
    1 LINUX_FLAGS    = -lm -lpthread 
    2 SOLARIS_FLAGS  = -lm -lnsl -lsocket -lrt -lpthread 
    3 SPECIFIC_FLAGS = $($(PLATFORM)_FLAGS) 
     1# 
     2#    Makefile for ew2moledb 
     3#  
    44 
    5 CFLAGS = $(GLOBALFLAGS) `$(MYSQL_CONFIG_PROG) --cflags` 
     5LINUX_FLAGS=-lpthread -fstack-check -Wall  
     6SOLARIS_FLAGS=-mt -lposix4 -lthread -lpthread -lsocket -lnsl -lm 
     7SPECIFIC_FLAGS=$($(PLATFORM)_FLAGS) 
    68 
    7 B = $(EW_HOME)/$(EW_VERSION)/bin 
    8 L = $(EW_HOME)/$(EW_VERSION)/lib 
     9LINUX_CFLAGS=-Wall  
     10SOLARIS_CFLAGS= 
     11SPECIFIC_CFLAGS=$($(PLATFORM)_CFLAGS) 
     12 
     13CFLAGS = -D_REENTRANT $(GLOBALFLAGS) $(SPECIFIC_CFLAGS) 
     14 
     15CFLAGS += -g 
    916 
    1017MYSQL_CONNECTOR_C_PATH_BUILD = $(EW_HOME)/$(EW_VERSION)/src/archiving/mole/mysql-connector-c-build 
     
    1522MYSQL_CONFIG_PROG = $(MYSQL_CONFIG_PROG_PATH)/mysql_config 
    1623 
     24CFLAGS += `$(MYSQL_CONFIG_PROG) --cflags` 
     25 
    1726APP = ew2moledb 
     27B = $(EW_HOME)/$(EW_VERSION)/bin 
     28L = $(EW_HOME)/$(EW_VERSION)/lib 
    1829 
    19 OBJS = \ 
    20         $(APP).o \ 
    21         ew2moledb_arc.o \ 
    22         ew2moledb_eb_alarm.o \ 
    23         ew2moledb_eb_hypotwc.o \ 
    24         ew2moledb_eb_picktwc.o \ 
    25         ew2moledb_error.o \ 
    26         ew2moledb_heartbeat.o \ 
    27         ew2moledb_magnitude.o \ 
    28         ew2moledb_mysql.o \ 
    29         ew2moledb_pickcoda.o \ 
    30         ew2moledb_quakelink.o \ 
    31         ew2moledb_sendmail.o \ 
    32         ew2moledb_strongmotionII.o \ 
    33         ew2moledb_tracebuf.o 
     30BINARIES = ew2moledb.o ew2moledb_tracebuf.o ew2moledb_pickcoda.o ew2moledb_quakelink.o \ 
     31           ew2moledb_strongmotionII.o ew2moledb_magnitude.o ew2moledb_arc.o \ 
     32           ew2moledb_sendmail.o ew2moledb_mysql.o ew2moledb_error.o ew2moledb_heartbeat.o \ 
     33           ew2moledb_eb_hypotwc.o ew2moledb_eb_picktwc.o ew2moledb_eb_alarm.o \ 
     34           $L/libebloc.a $L/libebpick.a \ 
     35           $L/swap.o $L/read_arc.o $L/rw_mag.o $L/rw_strongmotionII.o $L/rdpickcoda.o $L/sendmail.o \ 
     36           $L/mem_circ_queue.o $L/getsysname_ew.o $L/libew_mt.a $L/dirops_ew.o 
    3437 
    35 EW_LIBS = \ 
    36         $L/dirops_ew.o \ 
    37         $L/getsysname_ew.o \ 
    38         $L/mem_circ_queue.o \ 
    39         $L/rdpickcoda.o \ 
    40         $L/read_arc.o \ 
    41         $L/rw_mag.o \ 
    42         $L/rw_strongmotionII.o \ 
    43         $L/sendmail.o \ 
    44         $L/swap.o \ 
    45         -L$L -lebloc -lebpick -lew_mt 
     38HEADERS = ew2moledb_version.h \ 
     39          ew2moledb_tracebuf.h ew2moledb_pickcoda.h ew2moledb_quakelink.h \ 
     40          ew2moledb_strongmotionII.h ew2moledb_magnitude.h ew2moledb_arc.h \ 
     41          ew2moledb_sendmail.h ew2moledb_mysql.h ew2moledb_error.h ew2moledb_heartbeat.h \ 
     42          ew2moledb_eb_hypotwc.h ew2moledb_eb_picktwc.h ew2moledb_eb_alarm.h 
    4643 
    4744all: dynamic 
     
    4946dynamic: $B/$(APP) 
    5047 
    51 static: $(OBJS) 
    52         $(CC) -o $@ $(CFLAGS) $(LDFLAGS) $(OBJS) -L$(MYSQL_CONNECTOR_C_PATH_BUILD)/lib -lmysqlclient $(SPECIFIC_FLAGS) 
     48static: $(BINARIES) $(HEADERS) 
     49        $(CC) -o $B/ew2moledb $(CFLAGS) $(LDFLAGS) $(BINARIES) $(MYSQL_CONNECTOR_C_PATH_BUILD)/lib/libmysqlclient.a $(SPECIFIC_FLAGS) 
    5350 
    54 $B/$(APP): $(OBJS) 
    55         $(CC) -o $@ $(CFLAGS) $(LDFLAGS) `$(MYSQL_CONFIG_PROG) --libs_r` $(OBJS) $(SPECIFIC_FLAGS) 
     51$B/$(APP): $(BINARIES) $(HEADERS) 
     52        $(CC) -o $B/ew2moledb $(CFLAGS) $(LDFLAGS) `$(MYSQL_CONFIG_PROG) --libs_r` $(BINARIES) $(SPECIFIC_FLAGS) 
     53 
     54.c.o: 
     55        $(CC) -c $(CFLAGS)  $< 
    5656 
    5757 
     58lint: 
     59        lint ew2moledb.c $(GLOBALFLAGS) 
     60 
    5861# Clean-up rules 
    59 clean: PHONY 
    60         -$(RM) a.out core *.o *.obj *% *~ 
     62clean: 
     63        rm -f a.out core *.o 
    6164 
    62 clean_bin: PHONY 
    63         -$(RM) $B/$(APP) $B/$(APP).exe 
    64  
    65 PHONY: 
     65clean_bin: 
     66        rm -f $B/$(APP) 
  • branches/cosmos/src/archiving/trig2disk/makefile.unix

    r7912 r8041  
    2424        $L/parse_trig.o \ 
    2525        $L/putaway.o \ 
     26        $L/read_arc.o \ 
    2627        $L/sacputaway.o \ 
    2728        $L/seiputaway.o \ 
  • branches/cosmos/src/data_sources/geojson2ew/geojson_process.c

    r6962 r8041  
    3838 
    3939TRACE2_HEADER * get_trace_header() { 
    40    if (trace2_header == NULL) { 
    41       memset(&trace_buffer, 0, sizeof(TracePacket)); 
    42       trace2_header = &trace_buffer.trh2; 
    43       if (1 == htons(1)) // if big endian 
    44          trace2_header->datatype[0] = 's'; 
    45       else 
    46          trace2_header->datatype[0] = 'i'; 
    47       trace2_header->datatype[1] = '4'; 
    48       trace2_header->version[0] = TRACE2_VERSION0; 
    49       trace2_header->version[1] = TRACE2_VERSION1; 
    50       trace2_header->nsamp = 1; 
    51       trace_len = sizeof(TRACE2_HEADER) + 
    52          trace2_header->nsamp * sizeof(uint32_t); 
    53    } 
     40   memset(&trace_buffer, 0, sizeof(TracePacket)); 
     41   trace2_header = &trace_buffer.trh2; 
     42   if (1 == htons(1)) // if big endian 
     43      trace2_header->datatype[0] = 's'; 
     44   else 
     45      trace2_header->datatype[0] = 'i'; 
     46   trace2_header->datatype[1] = '4'; 
     47   trace2_header->version[0] = TRACE2_VERSION0; 
     48   trace2_header->version[1] = TRACE2_VERSION1; 
     49   trace2_header->nsamp = 1; 
     50   trace_len = sizeof(TRACE2_HEADER) + 
     51     trace2_header->nsamp * sizeof(uint32_t); 
     52    
    5453   return trace2_header; 
    5554} 
  • branches/cosmos/src/data_sources/geojson2ew/json_conn.c

    r7475 r8041  
    608608        // this should really be an assertion 
    609609        if (msg_buffer == NULL && msg_buffer_size != 0) { 
    610                 logit("et", "msg buffer is NULL but size=%d, setting to size to 0\n", msg_buffer_size); 
     610                logit("et", "msg buffer is NULL but size=%zd, setting to size to 0\n", msg_buffer_size); 
    611611                msg_buffer_size = 0; 
    612612        } 
  • branches/cosmos/src/data_sources/geojson2ew/main.c

    r6923 r8041  
    117117          /* init earthworm connection */ 
    118118          tport_attach( &Region, RingKey ); 
    119           logit("et", "%s: Attached to Ring Key=%d\n", Progname, RingKey); 
     119          logit("et", "%s: Attached to Ring Key=%ld\n", Progname, RingKey); 
    120120 
    121121          /* start EW heartbeat thread */ 
  • branches/cosmos/src/data_sources/geojson2ew/misc.h

    r6962 r8041  
    22#define _MISC_H 
    33 
    4 #define VER_NO "1.0.6 -  2017.243" 
     4#define VER_NO "1.0.7 -  2019.130" 
    55/* keep track of version notes here */ 
    66/* 
     
    88For support: mario@seismo.berkeley.edu 
    99 
     102019/05/10   1.0.7 -  2019.130 
     11- Fixed station name bug in output tracebuf2 header: when a DIF (5-char station name) is 
     12  followed by a PPP (4-char station names) message in the input geoJSON stream, there's a 
     13  left over character due to message buffers not being completely zero'd out between messages. 
     14 
    10152016/05/13   1.0.3 - 2016.133 
    11 Added support for ALL RabbitMQ exchange type connections: fanout, direct, topic, headers. 
    12 Upward compatible with previous version that supported named queues only. 
    13 Updated sample 'geojson2ew.d' file.  Existing *.d file(s) should work. 
    14 Changed File(s): misc.h json_conn.h json_conn.c getconfig.c geojson2ew.d 
     16- Added support for ALL RabbitMQ exchange type connections: fanout, direct, topic, headers. 
     17- Upward compatible with previous version that supported named queues only. 
     18- Updated sample 'geojson2ew.d' file.  Existing *.d file(s) should work. 
     19- Changed File(s): misc.h json_conn.h json_conn.c getconfig.c geojson2ew.d 
    1520 
    16212016/05/24   1.0.4 - 2016.145 
  • branches/cosmos/src/data_sources/psnadsend/makefile.unix

    r7918 r8041  
    4949 
    5050clean/here: PHONY 
    51         -$(RM) a.out core *.o *.obj *% *~ 
     51        -$(RM) a.out core *.o *.obj *.a *% *~ 
    5252 
    5353clean/lib: PHONY 
  • branches/cosmos/src/data_sources/tideweb2ew/http_error_codes.c

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/http_error_codes.h

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/http_fetcher.c

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/http_fetcher.h

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/makefile.nt

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/makefile.unix

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/tideweb2ew.c

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/tideweb2ew.d

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/tideweb2ew.desc

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/data_sources/tideweb2ew/tideweb2ew.h

    • Property svn:mergeinfo changed (with no actual effect on merging)
  • branches/cosmos/src/diagnostic_tools/sniffring/sniffring.c

    r7920 r8041  
    7272 
    7373#define MAX_SIZE MAX_BYTES_PER_EQ   /* Largest message size in characters */ 
    74 #define VERSION "V1.0.0 2019-03-14"   /* first version number introduced..*/ 
     74#define VERSION "V1.0.1 2019-07-03"   
    7575 
    7676/* Things to look up in the earthworm.h tables with getutil.c functions 
     
    200200      if (GetInst (argv[2+no_flush], &InstToGet) != 0) 
    201201      { 
    202          printf( "sniffring: Invalid installation name %s", argv[2]); 
     202         printf( "sniffring: Invalid installation name %s", argv[2+no_flush]); 
    203203         return -1; 
    204204      } 
    205205      if (GetModId (argv[3+no_flush], &ModToGet) != 0) 
    206206      { 
    207          printf( "sniffring: Invalid module name %s", argv[3]); 
     207         printf( "sniffring: Invalid module name %s", argv[3+no_flush]); 
    208208         return -1; 
    209209      } 
    210210      if (GetType (argv[4+no_flush], &TypeToGet) != 0) 
    211211      { 
    212          printf( "sniffring: Message of type name %s not found in earthworm.d or earthworm_global.d", argv[4]); 
     212         printf( "sniffring: Message of type name %s not found in earthworm.d or earthworm_global.d", argv[4+no_flush]); 
    213213         return -1; 
    214214      } 
  • branches/cosmos/src/diagnostic_tools/sniffwave/sniffwave.c

    r7691 r8041  
    306306       fprintf(stderr, "sniffwave: Too many parameters\n"); 
    307307     fprintf(stderr, "%s version %s\n", argv[0], VERSION); 
    308      fprintf(stderr,"Usage: %s <ring name> [sta] [comp] [net] [loc] [y/n/s/time] [v]\n", argv[0]); 
    309      fprintf(stderr, " Note: All parameters are positional, and all but first are optional.\n"); 
    310      fprintf(stderr, " Appending the optional 'v' or 'verbose' argument causes module,\n"); 
     308     fprintf(stderr,"\nUsage: %s <ring name> [sta] [comp] [net] [loc] [y/n/s/time] [v]\n", argv[0]); 
     309     fprintf(stderr, "\n Note: All parameters are positional, and all but first are optional.\n"); 
     310     fprintf(stderr, "\n Appending the optional 'v' or 'verbose' argument causes module,\n"); 
    311311     fprintf(stderr, " installation and type names to be printed in addition to usual ID numbers.\n"); 
    312      fprintf(stderr, " The <y/n/s> flag is a data flag or 'time in seconds'. If 'y' is specified\n"); 
     312     fprintf(stderr, "\n The <y/n/s> flag is a data flag or 'time in seconds'. If 'y' is specified\n"); 
    313313     fprintf(stderr, " the full data contained in the packet is printed out.\n"); 
    314314     fprintf(stderr, " If flag set to s, provides max/min/avg statistics of the trace data.\n"); 
    315315     fprintf(stderr, " If flag set to numeric value, program runs only for that number of seconds.\n"); 
    316      fprintf(stderr, " If sta comp net (but not loc) are specified then only TraceBuf\n"); 
     316     fprintf(stderr, "\n If sta comp net (but not loc) are specified then only TraceBuf\n"); 
    317317     fprintf(stderr, " packets will be fetched (not TraceBuf2); otherwise both are fetched.\n"); 
    318      fprintf(stderr, " sniffwave output Data and Feed latencies in this form [D: secs F: secs]\n"); 
    319      fprintf(stderr, " Data latency is the difference between current time and last sample time in current packet.\n"); 
    320      fprintf(stderr, " Feed latency is the difference between current time and previous packet arrival time.\n"); 
    321      fprintf(stderr, " Example: %s WAVE_RING PHOB wild NC wild n\n", argv[0]); 
     318     fprintf(stderr, "\n sniffwave output Data and Feed latencies in this form [D: secs F: secs]\n"); 
     319     fprintf(stderr, " [D] Data latency is the difference between current time and last sample time in current packet.\n"); 
     320     fprintf(stderr, " [F] Feed latency is the difference between current time and previous packet arrival time.\n"); 
     321     fprintf(stderr, "\n Example: %s WAVE_RING PHOB wild NC wild n\n", argv[0]); 
    322322     fprintf(stderr, " Example: %s WAVE_RING wild wild wild y verbose\n", argv[0]); 
    323      fprintf(stderr, " MSEED capability starting with version 2.5.1, prints mseed headers\n"); 
     323     fprintf(stderr, "\n MSEED capability starting with version 2.5.1, prints mseed headers\n"); 
    324324     fprintf(stderr, " of TYPE_MSEED packets (no filtering yet).\n"); 
    325325     return 1; 
  • branches/cosmos/src/display/webswave/webpage.h

    r6073 r8041  
    11unsigned char webswave_html_gz[] = { 
    2   0x1f, 0x8b, 0x08, 0x08, 0xb6, 0x7c, 0x3b, 0x53, 0x00, 0x03, 0x77, 0x65, 
     2  0x1f, 0x8b, 0x08, 0x08, 0x40, 0x22, 0x83, 0x5c, 0x00, 0x03, 0x77, 0x65, 
    33  0x62, 0x73, 0x77, 0x61, 0x76, 0x65, 0x2e, 0x68, 0x74, 0x6d, 0x6c, 0x00, 
    44  0xa5, 0x1b, 0x6b, 0x53, 0x1b, 0x39, 0xf2, 0xb3, 0xf3, 0x2b, 0xb4, 0xbe, 
  • branches/cosmos/src/libsrc/lib330/libstrucs.c

    r7516 r8041  
    3939   13 2015-09-25 dsn Configure pthread for libthread as detached thread,  
    4040                     libthread calls pthread_detach() and pthread_exit(). 
     41      2019-04-11 baker realloc() (actually, free(), malloc()) in getbuf() after 
     42                     advancing to next memory block when it is too small (fixes 
     43                     crash caused by buffer overflow past end of memory block). 
     44                     New static getmem() called by getbuf() and getthrbuf() to 
     45                     allocate memory buffers (fixes memory leak in getthrbuf()). 
    4146*/ 
    4247/* Make sure libstrucs.h is included */ 
     
    185190#endif 
    186191 
    187 void getbuf (pq330 q330, pointer *p, integer size) 
     192static void getmem (pmem_manager *pcurmem, pointer *p, integer size) 
    188193begin 
    189194  pbyte newblock ; 
    190195  pmem_manager pm ; 
    191196 
    192   pm = q330->cur_memory ; 
    193  
     197  pm = *pcurmem ; 
    194198  size = (size + 3) and 0xFFFFFFFC ; /* make multiple of longword */ 
     199  /* is there room in the current memory block? */ 
    195200  if ((pm->sofar + size) > pm->alloc_size) 
    196     then 
    197       begin /* need a new block of memory */ 
    198         if (q330->cur_memory->next) 
    199           then 
    200             begin /* already available from before */ 
    201               q330->cur_memory = q330->cur_memory->next ; 
    202               q330->cur_memory->sofar = 0 ; 
    203             end 
    204           else 
    205             begin /* need new allocation */ 
     201    then /* no, need a new block of memory */ 
     202      begin 
     203        /* does the memory blocks list have more entries? */ 
     204        if (pm->next) 
     205          then /* yes, use the next memory block */ 
     206            pm = pm->next ; 
     207          else /* no, need a new memory blocks list entry */ 
     208            begin 
    206209              pm->next = malloc (sizeof(tmem_manager)) ; 
    207210              pm = pm->next ; 
    208211              pm->next = NIL ; 
     212              pm->alloc_size = 0 ; 
     213              pm->base = NIL ; 
     214            end 
     215        /* is there room in the next memory block? */ 
     216        if (size > pm->alloc_size) 
     217          then /* no, need new (re-) allocation */ 
     218            begin 
     219              free (pm->base) ; 
    209220              if (size > DEFAULT_MEM_INC) 
    210221                then 
     
    212223                else 
    213224                  pm->alloc_size = DEFAULT_MEM_INC ; 
    214               pm->sofar = 0 ; 
    215225              pm->base = malloc (pm->alloc_size) ; 
    216               q330->cur_memory = pm ; 
    217226            end 
     227        pm->sofar = 0 ; 
     228        /* update the current memory block to the next memory block */ 
     229        *pcurmem = pm ; 
    218230      end 
    219   newblock = q330->cur_memory->base ; 
    220   incn(newblock, q330->cur_memory->sofar) ; 
    221   q330->cur_memory->sofar = q330->cur_memory->sofar + size ; 
     231  newblock = pm->base ; 
     232  incn(newblock, pm->sofar) ; 
     233  pm->sofar = pm->sofar + size ; 
    222234  memset (newblock, 0, size) ; /* make sure is zeroed out */ 
    223235  *p = newblock ; 
    224236end 
    225237 
     238void getbuf (pq330 q330, pointer *p, integer size) 
     239begin 
     240  getmem (addr(q330->cur_memory), p, size) ; 
     241end 
     242 
    226243void mem_release (pq330 q330) 
    227244begin 
     
    230247  pm = q330->memory_head ; 
    231248  while (pm) 
    232     begin /* release  blocks */ 
     249    begin /* release memory blocks for reuse */ 
    233250      pm->sofar = 0 ; 
    234251      pm = pm->next ; 
     
    238255void getthrbuf (pq330 q330, pointer *p, integer size) 
    239256begin 
    240   pbyte newblock ; 
    241  
    242   size = (size + 3) and 0xFFFFFFFC ; /* make multiple of longword */ 
    243   if ((q330->cur_thrmem->sofar + size) > q330->cur_thrmem->alloc_size) 
    244     then 
    245       begin /* need a new block of memory */ 
    246         q330->cur_thrmem->next = malloc (sizeof(tmem_manager)) ; 
    247         q330->cur_thrmem = q330->cur_thrmem->next ; 
    248         q330->cur_thrmem->next = NIL ; 
    249         if (size > DEFAULT_THR_INC) 
    250           then 
    251             q330->cur_thrmem->alloc_size = size ; 
    252           else 
    253             q330->cur_thrmem->alloc_size = DEFAULT_THR_INC ; 
    254         q330->cur_thrmem->sofar = 0 ; 
    255         q330->cur_thrmem->base = malloc (q330->cur_thrmem->alloc_size) ; 
    256       end 
    257   newblock = q330->cur_thrmem->base ; 
    258   incn(newblock, q330->cur_thrmem->sofar) ; 
    259   q330->cur_thrmem->sofar = q330->cur_thrmem->sofar + size ; 
    260   memset (newblock, 0, size) ; /* make sure is zeroed out */ 
    261   *p = newblock ; 
     257  getmem (addr(q330->cur_thrmem), p, size) ; 
    262258end 
    263259 
  • branches/cosmos/src/libsrc/util/rw_strongmotionII.c

    r7513 r8041  
     1/* 
     2 *   THIS FILE IS UNDER RCS - DO NOT MODIFY UNLESS YOU HAVE 
     3 *   CHECKED IT OUT USING THE COMMAND CHECKOUT. 
     4 * 
     5 *    $Id$ 
     6 * 
     7 *    Revision history: 
     8 *     $Log$ 
     9 *     Revision 1.5  2004/02/13 22:55:22  dietz 
     10 *     Now both "?" and "-" are interpreted as NULL values for 
     11 *     qid and qauthor on the QID: line when reading TYPE_STRONGMOTIONII msgs 
     12 * 
     13 *     Revision 1.4  2003/06/09 19:53:50  lombard 
     14 *     Rewrote rd_strongmotionII to be more fault-tolerant and to allow reading of 
     15 *     multiple channels from a single message. 
     16 * 
     17 *     Revision 1.3  2001/06/19 17:26:02  dietz 
     18 *     Fixed wr_strongmotionII to print SM_NULL values properly (it had been 
     19 *     taking the absolute value of them by mistake) 
     20 * 
     21 *     Revision 1.2  2001/04/18 17:56:27  dietz 
     22 *     wr_strongmotionII: made sure pga,pgv,pgd are written as absolute values 
     23 * 
     24 *     Revision 1.1  2001/04/17 17:25:46  davidk 
     25 *     Initial revision 
     26 * 
     27 * 
     28 * 
     29 */ 
     30 
    131/* rw_strongmotionII.c 
    232 * 
     
    1040#include <string.h> 
    1141#include <time.h> 
    12  
    13 #include "earthworm.h" 
    14 #include "chron3.h" 
    15 #include "time_ew.h" 
    16 #include "rw_strongmotionII.h" 
     42#include <chron3.h> 
     43#include <time_ew.h> 
     44#include <rw_strongmotionII.h> 
     45#include <earthworm.h> 
    1746 
    1847#define ABS(X) (((X) >= 0) ? (X) : -(X)) 
    1948 
    2049static int   strappend( char *s1, int s1max, char *s2 ); 
     50static int   tokenlength( char *begtok, char c ); 
    2151static char *datestr24( double t, char *pbuf, int len ); 
    2252static int   addtimestr( char *buf, int buflen, double t ); 
    23  
    24 #if 0 
    25 static int   tokenlength( char *begtok, char c ); 
    26 #endif 
    2753 
    2854static char *sNullDate = "0000/00/00 00:00:00.000"; 
     
    4066#define SM_RSA  1<<6 
    4167#define SM_QID  1<<7 
     68#define SM_AI   1<<8 
    4269#define SM_ALL (SM_SCNL | SM_TIME | SM_ALT | SM_PGA | SM_PGV | SM_PGD | SM_RSA | SM_QID) 
    4370#define SM_REQ (SM_SCNL | SM_TIME) 
     
    5784    return; 
    5885} 
     86 
     87 
    5988 
    6089/******************************************************************** 
     
    75104   char     line[SMLINE]; /* pointer to current line in msg */ 
    76105   char     *nextline;  /* working pointer into msg */ 
     106   int       nfreq; 
    77107   int       i; 
    78108   struct tm stm;       /* time structure for timestamp */ 
     
    83113 
    84114   nextline = *msgP; 
     115   nfreq = 0; 
    85116   smState = 0; 
    86117   status = 0; 
     
    625656           } 
    626657           /* End of QID line processing */ 
     658       } else if (strcmp(token, "AI:") == 0) { 
     659           if (HAVE(SM_SCNL) ) { 
     660               token = strtok(NULL, " \n"); 
     661               if (token == NULL) { 
     662                   if (logErr) 
     663                       logit("t", "error parsing SM AI line <%s>\n", line); 
     664                   status = -1; 
     665                   goto NextLine; 
     666               } 
     667               if( sscanf( token, "%lf", &sm->ai) != 1) { 
     668                   if (logErr) 
     669                       logit("t", "error parsing AI from <%s>\n", line); 
     670                   status = -1; 
     671                   goto NextLine; 
     672               } 
     673               smState |= SM_AI; 
     674           } else { 
     675               /* still looking for SCNL line to start message */ 
     676               goto NextLine; 
     677           } 
     678           /* End of AI line processing */ 
    627679       } else { 
    628680           /* unknown line; skip it for now */ 
     
    704756   if( strappend( buf, buflen, tmp ) ) return( -1 ); 
    705757 
     758/* Print the AI (Arias Intensity) */ 
     759   if( sm->ai != 0. ) 
     760   { 
     761     sprintf( tmp, "AI: %.6lf\n", sm->ai ); 
     762     if( strappend( buf, buflen, tmp ) ) return( -1 ); 
     763   } 
     764 
    706765   return( 0 ); 
    707766} 
     
    755814/* Print eventid & author */ 
    756815   logit("","\nQID: %s %s\n", sm->qid, sm->qauthor); 
     816 
     817/* Print the AI (Arias Intensity) */ 
     818   if( sm->ai != 0. ) 
     819   { 
     820     logit("","AI: %.6lf\n", sm->ai ); 
     821   } 
    757822 
    758823   return; 
     
    838903 * found, tokenlength returns the length of the string.             * 
    839904 ********************************************************************/ 
    840  
    841 #if 0 
    842  
    843905int tokenlength( char *begtok, char c ) 
    844906{ 
     
    850912} 
    851913 
    852 #endif 
    853914 
    854915/* Sample TYPE_STRONGMOTION2 message (between ------): 
  • branches/cosmos/src/libsrc/util/socket_ew_common.c

    r7843 r8041  
    110110   char dupAddress[64];                            //for testing/checking IPv6 addresses 
    111111 
     112   /* SWL 2019-06-19 Seems we need to initialize the Windows system before we can get  addrinfo       * 
     113    * Shouldn't hurt anything to do it here rather than in socket_ew below, and it fixes new failures * 
     114    * in heli_ewII, ewhtmlemail, q3302ew, etc. Hopefully things'll run OK on Linux.                   */ 
     115   if (!SOCKET_SYS_INIT) 
     116           SocketSysInit(); 
     117 
    112118   // Get address(es) 
    113119   struct addrinfo *servAddr; // Holder for returned list of server addrs 
  • branches/cosmos/src/reporting/ewhtmlemail/ewhtmlemail.c

    r7763 r8041  
    3636/* 1.2.5 - 2019-01-28 - added colspan directives to waveform google charts, Roberto Mirabella  suggestion */ 
    3737/* 1.2.6 - 2019-02-04 - added UseEarliestPhaseTime for waveform start */ 
    38  
    39 #define VERSION_STR "1.2.6 - 2019-02-04" 
     38/* 1.2.7 - 2019-05-01 - added option to use EWAVE plotting service */ 
     39 
     40#define VERSION_STR "1.2.7 - 2019-05-01" 
    4041 
    4142#define MAX_GE_MARKERS 20 
     
    4546/* Includes 
    4647 **********/ 
     48#include <stdarg.h> 
    4749#include <stdio.h> 
    4850#include <stdlib.h> 
     
    133135int process_message(HypoArc *arc, MAG_INFO *mag, MAG_INFO *mw, MSG_LOGO reclogo); 
    134136void GoogleMapRequest(char*, SITE**, int, double, double); 
    135 void GoogleChartRequest(char*, int*, double*, int, int, char, int); 
    136137char simpleEncode(int); 
    137138int searchSite(char*, char*, char*, char*); 
     
    140141int trbufresample( int*, int, char*, int, double, double, int ); 
    141142double fbuffer_add( double*, int, double ); 
     143int writePlotRequest(char *, size_t, long, char *, char *, char *, char *, char *, char *, time_t, int, time_t, char *);  
    142144int makeGoogleChart( char*, int*, int, char *, double, int, int ); 
    143145void gdImagePolyLine( gdImagePtr, gdPointPtr, int, int ); 
     
    176178static double     TimeMargin = 10;        // Margin to download samples. 
    177179static double     DurationMax = 144.;     // Maximum duration to show., truncate to this if greater (configurable) 
    178 static int        UseBlat = 0;        // use blat syntaxi as the mail program instead of a UNIX like style 
    179 static int        UseRegionName = 0;        // put Region Name from FlynnEnghdal region into table at top, off by default 
     180static int                UseBlat = 0;        // use blat syntaxi as the mail program instead of a UNIX like style 
     181static int                UseRegionName = 0;        // put Region Name from FlynnEnghdal region into table at top, off by default 
    180182static char       BlatOptions[MAX_STRING_SIZE];      // apply any options needed after the file....-server -p profile etc... 
    181183static char       StaticMapType[MAX_STRING_SIZE];      // optional, specification of google map type 
     
    205207static int        UseMW = 0;     // wait for MW before releasing event 
    206208static int        MagWaitSeconds = 5;     // wait for ML or Mw for this number of seconds and then release if it doesn't show up 
    207 static long       last_qid = 0;         // last qid released 
     209static long       last_qid = 0;         // last qid released 
    208210static time_t     last_qid_time = 0;  // last qid at time 
    209211static int        qid_counter = 0;  // counter for qids in queue awaiting MLs 
     
    219221static int        TraceHeight = 61;        // Height of the GIF files 
    220222 
     223static int        UseEWAVE = 0;                 //Use the EWAVE plotting service to generate images 
     224static char       ewaveAddr[64]; 
     225static char       ewavePort[16]; 
    221226// Array of waveservers 
    222227static WAVESERV   waveservers[MAX_WAVE_SERVERS]; 
     
    246251static char  Text[150];        // string for log/error messages 
    247252 
    248 #define MAX_QUAKES      100     // should make this configurable at some point 
     253#define MAX_QUAKES      100     // should make this configurable at some point 
    249254#define MAX_MAG_CHANS 1000      // this SHOULD be enough 
    250255 
     
    429434                if (last_qid!= 0 && (now - last_qid_time) > MagWaitSeconds) { 
    430435                    /* release all qids since last_qid */ 
    431                     logit( "t", "ewhtmlemail: NO Mags observed from mag engines for %d seconds, freeing them up!\n", MagWaitSeconds); 
     436                                logit( "t", "ewhtmlemail: NO Mags observed from mag engines for %d seconds, freeing them up!\n", MagWaitSeconds); 
    432437                    for (i=0; i< qid_counter; i++) { 
    433438                        arc = arc_list[(last_qid+i)%MAX_QUAKES]; 
    434439                        if (arc != NULL) { 
    435440                                if (qid_l == qid_w && UseMW && UseML && qid_l == arc->sum.qid) { 
    436                                    process_message(arc, &mag_l, &mag_w, reclogo); 
    437                                    qid_l = qid_w = 0;      /* reset qid trackers */ 
     441                                                           process_message(arc, &mag_l, &mag_w, reclogo); 
     442                                                           qid_l = qid_w = 0;      /* reset qid trackers */ 
    438443                                } else if (UseML && qid_l == arc->sum.qid) { 
    439                                    process_message(arc, &mag_l, NULL, reclogo); 
    440                                    qid_l = 0;         /* reset qid tracker */ 
     444                                                           process_message(arc, &mag_l, NULL, reclogo); 
     445                                                           qid_l = 0;         /* reset qid tracker */ 
    441446                                } else if (UseMW && qid_w == arc->sum.qid) { 
    442                                    process_message(arc, NULL, &mag_w, reclogo); 
    443                                    qid_w = 0;         /* reset qid tracker */ 
     447                                                           process_message(arc, NULL, &mag_w, reclogo); 
     448                                                           qid_w = 0;         /* reset qid tracker */ 
    444449                                } else { 
    445                                    process_message(arc, NULL, NULL, reclogo); 
     450                                                           process_message(arc, NULL, NULL, reclogo); 
    446451                                } 
    447                                 free_phases(arc); 
    448                                 free(arc); 
     452                                                free_phases(arc); 
     453                                                free(arc); 
    449454                                arc_list[(last_qid+i)%MAX_QUAKES] = NULL; 
    450455                        } 
     
    505510         long qid = 0; 
    506511         if (rd_mag(msgbuf, recsize, &mag_tmp) != 0) { 
    507             logit( "et", "ewhtmlemail: Error parsing mag message: %s\n", msgbuf); 
     512                logit( "et", "ewhtmlemail: Error parsing mag message: %s\n", msgbuf); 
    508513             continue; 
    509514         } 
    510515         logit( "t", "ewhtmlemail: received magnitude type %s for qid=%s\n", MagNames[mag_tmp.imagtype], mag_tmp.qid ); 
    511516         if (UseMW && mag_tmp.imagtype == MAGTYPE_MOMENT) { 
    512             rd_mag(msgbuf, recsize, &mag_w); 
     517                rd_mag(msgbuf, recsize, &mag_w); 
    513518             qid = qid_w = atoi(mag_w.qid); 
    514519         } else { 
    515             rd_mag(msgbuf, recsize, &mag_l); 
     520                rd_mag(msgbuf, recsize, &mag_l); 
    516521             qid = qid_l = atoi(mag_l.qid); 
    517522         } 
     
    519524         /* check that qid actually matches summary qid because we may have a mag post-restart with no qid */ 
    520525         if (arc != NULL && arc->sum.qid == qid) { 
    521             if (UseMW && arc->sum.qid == qid_w && UseML && arc->sum.qid == qid_l) { 
     526                if (UseMW && arc->sum.qid == qid_w && UseML && arc->sum.qid == qid_l) { 
    522527                /* case 1, got them both and both are current to this arc */ 
    523528                      process_message(arc, &mag_l, &mag_w, reclogo); 
    524529                      qid_l = qid_w = 0;         /* reset qid trackers */ 
    525             } else if (!UseML && UseMW && arc->sum.qid == qid_w) { 
    526                         /* case 2 only care about Mw , got it */ 
     530                } else if (!UseML && UseMW && arc->sum.qid == qid_w) { 
     531                                /* case 2 only care about Mw , got it */ 
    527532                      process_message(arc, NULL, &mag_w, reclogo); 
    528533                      qid_w = 0;                 /* reset qid tracker */ 
    529             } else if (!UseMW && UseML && arc->sum.qid == qid_l) { 
    530                         /* case 3 only care about ML, got it */ 
     534                } else if (!UseMW && UseML && arc->sum.qid == qid_l) { 
     535                                /* case 3 only care about ML, got it */ 
    531536                      process_message(arc, &mag_l, NULL,reclogo); 
    532537                      qid_l = 0;                 /* reset qid tracker */ 
    533             } else { 
     538                } else { 
    534539                        /* case 4 we want both, but only got 1 so far */ 
    535540                        continue; 
    536             } 
    537             /* if we reach here, we processed the message with the accompanying mags */ 
     541                } 
     542                /* if we reach here, we processed the message with the accompanying mags */ 
    538543            free_phases(arc); 
    539544            free(arc); 
     
    546551            } 
    547552         } else { 
    548             logit( "et", "ewhtmlemail: NO matching hypocenter found for mag message with qid=%ld!\n", qid); 
     553                logit( "et", "ewhtmlemail: NO matching hypocenter found for mag message with qid=%ld!\n", qid); 
    549554         } 
    550555      } else if (reclogo.type == TypeNoMagnitude && (UseML || UseMW)) { 
     
    608613         if (!UseML && !UseMW) { 
    609614             process_message(arc, NULL, NULL, reclogo); 
    610             free(arc); 
    611             free_phases(arc); 
     615                free(arc); 
     616                free_phases(arc); 
    612617         } else { 
    613618             /* store it for later use */ 
    614619             arc_list[arc->sum.qid%MAX_QUAKES] = arc; 
    615             logit( "t", "ewhtmlemail: storing hypocenter while waiting for possible ML, qid=%ld!\n", arc->sum.qid); 
     620                logit( "t", "ewhtmlemail: storing hypocenter while waiting for possible ML, qid=%ld!\n", arc->sum.qid); 
    616621             if (last_qid == 0) { 
    617622                last_qid = arc->sum.qid;        /* set it to this one */ 
     
    655660   int i; 
    656661   char cp[80]; 
    657    int          j, k, num_sides; 
     662   int          j, k, num_sides; 
    658663 
    659664   BlatOptions[0]=0; 
     
    849854         { 
    850855            str = k_str(); 
    851             MinQuality = str[0]; 
     856                MinQuality = str[0]; 
    852857         } 
    853858         else if ( k_its("WSTimeout") ) 
     
    860865            init[6] = 1; 
    861866         } 
    862          else if ( k_its("GoogleEarthKey") )    // now required 
     867         else if ( k_its("GoogleEarthKey") )    // now required 
    863868         { 
    864869            strcpy(GE_key, k_str()); 
     
    867872         { 
    868873            strcpy(GE_secret, k_str()); 
    869             /* decode the secret */ 
     874                /* decode the secret */ 
    870875            decoded_secret = b64_decode (GE_secret, strlen((const char *)GE_secret)); 
    871876         } 
     
    885890         else if ( k_its("StyleFile") ) 
    886891         { 
    887                 /* RSL: Removed styles */ 
     892                        /* RSL: Removed styles */ 
    888893            //strcpy(StyleFile, k_str()); 
    889894         } 
     
    913918         else if ( k_its("UseRegionName") ) 
    914919         { 
    915                 UseRegionName = 1; 
     920                UseRegionName = 1; 
    916921         } 
    917922         else if ( k_its("UseBlat") ) 
    918923         { 
    919                 UseBlat = 1; 
     924                UseBlat = 1; 
    920925         } 
    921926         else if ( k_its("BlatOptions") ) 
    922927         { 
    923                 strcpy(BlatOptions, k_str()); 
     928                strcpy(BlatOptions, k_str()); 
    924929         } 
    925930         else if ( k_its("StaticMapType") ) 
    926931         { 
    927                 strcpy(StaticMapType, k_str()); 
     932                strcpy(StaticMapType, k_str()); 
    928933         } 
    929934         else if ( k_its("DontShowMd") ) 
    930935         { 
    931                 DontShowMd = 1; 
     936                DontShowMd = 1; 
    932937         } 
    933938         else if ( k_its("DontShowTraces") ) 
    934939         { 
    935                 DontShowTraces = 1; 
     940                DontShowTraces = 1; 
    936941         } 
    937942         else if ( k_its("DontShowMLtable") ) 
    938943         { 
    939                 DontShowMLtable = 1; 
     944                DontShowMLtable = 1; 
    940945         } 
    941946         else if ( k_its("DontUseMd") ) 
    942947         { 
    943                 DontUseMd = 1; 
     948                DontUseMd = 1; 
    944949         } 
    945950         else if ( k_its("UseUTC") ) 
    946951         { 
    947                 UseUTC = 1; 
     952                UseUTC = 1; 
    948953         } 
    949954         else if ( k_its("MaxDuration") ) 
     
    962967         else if ( k_its("DataCenter") ) 
    963968         { 
    964                 strcpy(DataCenter, strtok(k_str(),"\"")); 
     969                strcpy(DataCenter, strtok(k_str(),"\"")); 
    965970         } 
    966971         else if (k_its("SPfilter")) 
     
    987992         { 
    988993                        Mercator = 1; 
    989             } 
    990             else if ( k_its("Albers") ) 
    991             { 
     994                } 
     995                else if ( k_its("Albers") ) 
     996                { 
    992997                        Albers=1; 
    993998                        Mercator=0; 
     
    9951000         else if ( k_its("UseML") ) 
    9961001         { 
    997                 UseML = 1; 
     1002                UseML = 1; 
    9981003         } 
    9991004         else if ( k_its("UseMW") ) 
    10001005         { 
    1001                 UseMW = 1; 
     1006                UseMW = 1; 
    10021007         } 
    10031008         else if ( k_its("ShowDetail") ) 
    10041009         { 
    1005                 ShowDetail = 1; 
     1010                ShowDetail = 1; 
    10061011         } 
    10071012         else if ( k_its("ShowDetailedSubject") ) 
    10081013         { 
    1009                 ShowDetailedSubject = 1; 
     1014                ShowDetailedSubject = 1; 
    10101015         } 
    10111016         else if ( k_its("DontShowStationsOnMap") ) 
    10121017         { 
    1013                 DontShowStationsOnMap = 1; 
     1018                DontShowStationsOnMap = 1; 
    10141019         } 
    1015          else if ( k_its("ShortHeader") ) 
    1016          { 
    1017                 ShortHeader = 1; 
     1020     else if ( k_its("ShortHeader") ) 
     1021     { 
     1022                ShortHeader = 1; 
    10181023         } 
    1019          else if ( k_its("UseGIF") ) 
    1020          { 
    1021                     UseGIF = 1; 
    1022          } 
    1023          else if ( k_its("TraceWidth") ) 
    1024          { 
    1025             TraceWidth = (int) k_int(); 
    1026          } 
    1027          else if ( k_its("TraceHeight") ) 
    1028          { 
    1029             TraceHeight = (int) k_int(); 
    1030          } 
    1031          else if ( k_its("EmailRecipientWithMinMagAndDist") ) 
    1032          { 
    1033                     if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
    1034                         { 
    1035                                 strcpy(emailrecipients[nemailrecipients].address, k_str()); 
    1036                                 emailrecipients[nemailrecipients].min_magnitude = k_val(); 
    1037                                 emailrecipients[nemailrecipients].max_distance = k_val(); 
    1038                                 emailrecipients[nemailrecipients].num_regions = 0; 
    1039                 emailrecipients[nemailrecipients].fullMsg = 1; 
    1040                 nemailrecipients++; 
     1024         else if ( k_its("EwaveAddr") ) 
     1025        { 
     1026                if ((str = k_str()) != NULL) { 
     1027                        strncpy(ewaveAddr, str, 64); 
     1028                        UseEWAVE = 1; 
     1029                } 
     1030        } 
     1031        else if ( k_its("EwavePort") ) 
     1032        { 
     1033                if ((str = k_str()) != NULL) { 
     1034                        strncpy(ewavePort, str, 16); 
     1035                } 
     1036        } 
     1037        else if ( k_its("UseGIF") ) 
     1038    { 
     1039                UseGIF = 1; 
     1040        } 
     1041        else if ( k_its("TraceWidth") ) 
     1042        { 
     1043        TraceWidth = (int) k_int(); 
     1044    } 
     1045        else if ( k_its("TraceHeight") ) 
     1046    { 
     1047                TraceHeight = (int) k_int(); 
     1048    } 
     1049    else if ( k_its("EmailRecipientWithMinMagAndDist") ) 
     1050    { 
     1051                if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
     1052                { 
     1053                        strcpy(emailrecipients[nemailrecipients].address, k_str()); 
     1054                        emailrecipients[nemailrecipients].min_magnitude = k_val(); 
     1055                        emailrecipients[nemailrecipients].max_distance = k_val(); 
     1056                        emailrecipients[nemailrecipients].num_regions = 0; 
     1057            emailrecipients[nemailrecipients].fullMsg = 1; 
     1058            nemailrecipients++; 
     1059                } 
     1060                else 
     1061                { 
     1062                        logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
     1063                                        exit(-1); 
     1064                } 
     1065        } 
     1066    else if ( k_its("EmailRecipientWithMinMag") ) 
     1067    { 
     1068                if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
     1069                { 
     1070                        strcpy(emailrecipients[nemailrecipients].address, k_str()); 
     1071                        emailrecipients[nemailrecipients].min_magnitude = k_val(); 
     1072                        emailrecipients[nemailrecipients].max_distance  = OTHER_WORLD_DISTANCE_KM; 
     1073                        emailrecipients[nemailrecipients].num_regions = 0; 
     1074                        emailrecipients[nemailrecipients].fullMsg = 1; 
     1075                        nemailrecipients++; 
     1076                } 
     1077                else 
     1078                { 
     1079                        logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
     1080                                        exit(-1); 
     1081                } 
     1082        } 
     1083    else if ( k_its("EmailRecipient") ) 
     1084    { 
     1085                if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
     1086                { 
     1087                        strcpy(emailrecipients[nemailrecipients].address, k_str()); 
     1088                        emailrecipients[nemailrecipients].min_magnitude = DUMMY_MAG; 
     1089                        emailrecipients[nemailrecipients].max_distance  = OTHER_WORLD_DISTANCE_KM; 
     1090                        emailrecipients[nemailrecipients].num_regions = 0; 
     1091                        emailrecipients[nemailrecipients].fullMsg = 1; 
     1092                        nemailrecipients++; 
     1093                } 
     1094                else 
     1095                { 
     1096                        logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
     1097                                        exit(-1); 
     1098                } 
     1099    } 
     1100    else if ( k_its("EmailRecipientWithinRegion") ) 
     1101    { 
     1102                if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
     1103                { 
     1104                        char msgType = '?'; 
     1105                        strcpy(emailrecipients[nemailrecipients].address, k_str()); 
     1106                        emailrecipients[nemailrecipients].min_magnitude = DUMMY_MAG; 
     1107                        emailrecipients[nemailrecipients].max_distance  = OTHER_WORLD_DISTANCE_KM; 
     1108                        emailrecipients[nemailrecipients].num_regions = 0; 
     1109                        for ( j=0; j<MAX_EMAIL_REGIONS; j++ ) { 
     1110                                str = k_str(); 
     1111                                if ( str == NULL ) { 
     1112                                  k_err(); // reset err 
     1113                                        break; 
     1114                                } 
     1115                                if ( strcmp( str, "html" ) == 0 ) { 
     1116                                        if ( msgType =='C' ) { 
     1117                                                logit( "e", "ewhtmlemail: Both message formats specified for %s in <EmailRecipientWithinRegion>; exiting.\n", emailrecipients[nemailrecipients].address ); 
     1118                                                exit( -1 ); 
     1119                                        } 
     1120                                        msgType = 'H'; 
     1121                                        continue; 
     1122                                } else if ( strcmp( str, "csv" ) == 0 ) { 
     1123                                        if ( msgType =='H' ) { 
     1124                                                logit( "e", "ewhtmlemail: Both message formats specified for %s in <EmailRecipientWithinRegion>; exiting.\n", emailrecipients[nemailrecipients].address ); 
     1125                                                exit( -1 ); 
     1126                                        } 
     1127                                        msgType = 'C'; 
     1128                                        continue; 
     1129                                } 
     1130                                k = lookupRegion( str ); //+ (str[0] == '~' ? 1 : 0) ); 
     1131                                if ( k == -1 ) { 
     1132                                        logit("e", "ewhtmlemail: Unknown region (%s) in <EmailRecipientWithinRegion>; exiting.\n", str); 
     1133                                        exit( -1 ); 
     1134                                } 
     1135                                emailrecipients[nemailrecipients].region_ids[j] = (k); // + (str[0] == '~' ? -MAX_REGIONS : 0) ); 
     1136                                emailrecipients[nemailrecipients].num_regions += 1; 
    10411137                        } 
    1042                         else 
    1043                         { 
    1044                                 logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
    1045                                 exit(-1); 
     1138                        if ( j==0 ) { 
     1139                                logit("e", "ewhtmlemail: <EmailRecipientWithinRegion> with no regions; exiting.\n"); 
     1140                                exit( -1 ); 
    10461141                        } 
    1047          } 
    1048          else if ( k_its("EmailRecipientWithMinMag") ) 
    1049          { 
    1050                     if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
    1051                         { 
    1052                                 strcpy(emailrecipients[nemailrecipients].address, k_str()); 
    1053                                 emailrecipients[nemailrecipients].min_magnitude = k_val(); 
    1054                                 emailrecipients[nemailrecipients].max_distance  = OTHER_WORLD_DISTANCE_KM; 
    1055                                 emailrecipients[nemailrecipients].num_regions = 0; 
    1056                                 emailrecipients[nemailrecipients].fullMsg = 1; 
    1057                                 nemailrecipients++; 
     1142                        if ( k_str() ) { 
     1143                                logit("e", "ewhtmlemail: <EmailRecipientWithinRegion> with too many regions; exiting.\n"); 
     1144                                exit( -1 ); 
    10581145                        } 
    1059                         else 
    1060                         { 
    1061                                 logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
    1062                                 exit(-1); 
     1146                        k_err(); // reset err 
     1147                        emailrecipients[nemailrecipients].fullMsg = ( msgType!='C' ); 
     1148                        nemailrecipients++; 
     1149                } 
     1150                else 
     1151                { 
     1152                        logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
     1153                        exit(-1); 
     1154                } 
     1155        } 
     1156    else if ( k_its("EmailRecipientWithinRegionMag") ) 
     1157    { 
     1158                if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
     1159                { 
     1160                        char msgType = '?'; 
     1161                        strcpy(emailrecipients[nemailrecipients].address, k_str()); 
     1162                        emailrecipients[nemailrecipients].max_distance  = OTHER_WORLD_DISTANCE_KM; 
     1163                        emailrecipients[nemailrecipients].num_regions = 0; 
     1164                        for ( j=0; j<MAX_EMAIL_REGIONS; j++ ) { 
     1165                                str = k_str(); 
     1166                                if ( str == NULL ) { 
     1167                                        k_err(); // reset err 
     1168                                        break; 
     1169                                } 
     1170                                if ( strcmp( str, "html" ) == 0 ) { 
     1171                                        if ( msgType =='C' ) { 
     1172                                                logit( "e", "ewhtmlemail: Both message formats specified for %s in <EmailRecipientWithinRegionMag>; exiting.\n", emailrecipients[nemailrecipients].address ); 
     1173                                                exit( -1 ); 
     1174                                        } 
     1175                                        msgType = 'H'; 
     1176                                        continue; 
     1177                                } else if ( strcmp( str, "csv" ) == 0 ) { 
     1178                                        if ( msgType =='H' ) { 
     1179                                                logit( "e", "ewhtmlemail: Both message formats specified for %s in <EmailRecipientWithinRegionMag>; exiting.\n", emailrecipients[nemailrecipients].address ); 
     1180                                                exit( -1 ); 
     1181                                        } 
     1182                                        msgType = 'C'; 
     1183                                        continue; 
     1184                                } 
     1185                                k = lookupRegion( str ); //+ (str[0] == '~' ? 1 : 0) ); 
     1186                                if ( k == -1 ) { 
     1187                                        logit("e", "ewhtmlemail: Unknown region (%s) in <EmailRecipientWithinRegionMag>; exiting.\n", str); 
     1188                                        exit( -1 ); 
     1189                                } 
     1190                                emailrecipients[nemailrecipients].min_magnitude = k_int(); 
     1191                                emailrecipients[nemailrecipients].region_ids[j] = (k); // + (str[0] == '~' ? -MAX_REGIONS : 0) ); 
     1192                                emailrecipients[nemailrecipients].num_regions += 1; 
    10631193                        } 
    1064          } 
    1065          else if ( k_its("EmailRecipient") ) 
    1066          { 
    1067                     if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
    1068                         { 
    1069                                 strcpy(emailrecipients[nemailrecipients].address, k_str()); 
    1070                                 emailrecipients[nemailrecipients].min_magnitude = DUMMY_MAG; 
    1071                                 emailrecipients[nemailrecipients].max_distance  = OTHER_WORLD_DISTANCE_KM; 
    1072                                 emailrecipients[nemailrecipients].num_regions = 0; 
    1073                                 emailrecipients[nemailrecipients].fullMsg = 1; 
    1074                                 nemailrecipients++; 
     1194                        if ( j==0 ) { 
     1195                                logit("e", "ewhtmlemail: <EmailRecipientWithinRegionMag> with no regions; exiting.\n"); 
     1196                                exit( -1 ); 
    10751197                        } 
    1076                         else 
    1077                         { 
    1078                                 logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
    1079                                 exit(-1); 
     1198                        if ( k_str() ) { 
     1199                                logit("e", "ewhtmlemail: <EmailRecipientWithinRegionMag> with too many regions; exiting.\n"); 
     1200                                exit( -1 ); 
    10801201                        } 
    1081          } 
    1082          else if ( k_its("EmailRecipientWithinRegion") ) 
    1083          { 
    1084                     if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
    1085                         { 
    1086                             char msgType = '?'; 
    1087                                 strcpy(emailrecipients[nemailrecipients].address, k_str()); 
    1088                                 emailrecipients[nemailrecipients].min_magnitude = DUMMY_MAG; 
    1089                                 emailrecipients[nemailrecipients].max_distance  = OTHER_WORLD_DISTANCE_KM; 
    1090                                 emailrecipients[nemailrecipients].num_regions = 0; 
    1091                                 for ( j=0; j<MAX_EMAIL_REGIONS; j++ ) { 
    1092                                     str = k_str(); 
    1093                                     if ( str == NULL ) { 
    1094                                       k_err(); // reset err 
    1095                                         break; 
    1096                                     } 
    1097                                     if ( strcmp( str, "html" ) == 0 ) { 
    1098                                         if ( msgType =='C' ) { 
    1099                                             logit( "e", "ewhtmlemail: Both message formats specified for %s in <EmailRecipientWithinRegion>; exiting.\n", emailrecipients[nemailrecipients].address ); 
    1100                                             exit( -1 ); 
    1101                                         } 
    1102                                         msgType = 'H'; 
    1103                                         continue; 
    1104                                     } else if ( strcmp( str, "csv" ) == 0 ) { 
    1105                                         if ( msgType =='H' ) { 
    1106                                             logit( "e", "ewhtmlemail: Both message formats specified for %s in <EmailRecipientWithinRegion>; exiting.\n", emailrecipients[nemailrecipients].address ); 
    1107                                             exit( -1 ); 
    1108                                         } 
    1109                                         msgType = 'C'; 
    1110                                         continue; 
    1111                                     } 
    1112                                     k = lookupRegion( str ); //+ (str[0] == '~' ? 1 : 0) ); 
    1113                                     if ( k == -1 ) { 
    1114                                       logit("e", "ewhtmlemail: Unknown region (%s) in <EmailRecipientWithinRegion>; exiting.\n", str); 
    1115                                       exit( -1 ); 
    1116                                     } 
    1117                                     emailrecipients[nemailrecipients].region_ids[j] = (k); // + (str[0] == '~' ? -MAX_REGIONS : 0) ); 
    1118                                     emailrecipients[nemailrecipients].num_regions += 1; 
    1119                                 } 
    1120                                 if ( j==0 ) { 
    1121                                   logit("e", "ewhtmlemail: <EmailRecipientWithinRegion> with no regions; exiting.\n"); 
    1122                                   exit( -1 ); 
    1123                                 } 
    1124                                 if ( k_str() ) { 
    1125                                   logit("e", "ewhtmlemail: <EmailRecipientWithinRegion> with too many regions; exiting.\n"); 
    1126                                   exit( -1 ); 
    1127                                 } 
    1128                                 k_err(); // reset err 
    1129                                 emailrecipients[nemailrecipients].fullMsg = ( msgType!='C' ); 
    1130                                 nemailrecipients++; 
    1131                         } 
    1132                         else 
    1133                         { 
    1134                                 logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
    1135                                 exit(-1); 
    1136                         } 
    1137          } 
    1138          else if ( k_its("EmailRecipientWithinRegionMag") ) 
    1139          { 
    1140                     if (nemailrecipients<MAX_EMAIL_RECIPIENTS) 
    1141                         { 
    1142                             char msgType = '?'; 
    1143                                 strcpy(emailrecipients[nemailrecipients].address, k_str()); 
    1144                                 emailrecipients[nemailrecipients].max_distance  = OTHER_WORLD_DISTANCE_KM; 
    1145                                 emailrecipients[nemailrecipients].num_regions = 0; 
    1146                                 for ( j=0; j<MAX_EMAIL_REGIONS; j++ ) { 
    1147                                     str = k_str(); 
    1148                                     if ( str == NULL ) { 
    1149                                       k_err(); // reset err 
    1150                                         break; 
    1151                                     } 
    1152                                     if ( strcmp( str, "html" ) == 0 ) { 
    1153                                         if ( msgType =='C' ) { 
    1154                                             logit( "e", "ewhtmlemail: Both message formats specified for %s in <EmailRecipientWithinRegionMag>; exiting.\n", emailrecipients[nemailrecipients].address ); 
    1155                                             exit( -1 ); 
    1156                                         } 
    1157                                         msgType = 'H'; 
    1158                                         continue; 
    1159                                     } else if ( strcmp( str, "csv" ) == 0 ) { 
    1160                                         if ( msgType =='H' ) { 
    1161                                             logit( "e", "ewhtmlemail: Both message formats specified for %s in <EmailRecipientWithinRegionMag>; exiting.\n", emailrecipients[nemailrecipients].address ); 
    1162                                             exit( -1 ); 
    1163                                         } 
    1164                                         msgType = 'C'; 
    1165                                         continue; 
    1166                                     } 
    1167                                     k = lookupRegion( str ); //+ (str[0] == '~' ? 1 : 0) ); 
    1168                                     if ( k == -1 ) { 
    1169                                       logit("e", "ewhtmlemail: Unknown region (%s) in <EmailRecipientWithinRegionMag>; exiting.\n", str); 
    1170                                       exit( -1 ); 
    1171                                     } 
    1172                                     emailrecipients[nemailrecipients].min_magnitude = k_int(); 
    1173                                     emailrecipients[nemailrecipients].region_ids[j] = (k); // + (str[0] == '~' ? -MAX_REGIONS : 0) ); 
    1174                                     emailrecipients[nemailrecipients].num_regions += 1; 
    1175                                 } 
    1176                                 if ( j==0 ) { 
    1177                                   logit("e", "ewhtmlemail: <EmailRecipientWithinRegionMag> with no regions; exiting.\n"); 
    1178                                   exit( -1 ); 
    1179                                 } 
    1180                                 if ( k_str() ) { 
    1181                                   logit("e", "ewhtmlemail: <EmailRecipientWithinRegionMag> with too many regions; exiting.\n"); 
    1182                                   exit( -1 ); 
    1183                                 } 
    1184                                 k_err(); // reset err 
    1185                                 emailrecipients[nemailrecipients].fullMsg = ( msgType!='C' ); 
    1186                                 nemailrecipients++; 
    1187                         } 
    1188                         else 
    1189                         { 
    1190                                 logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
    1191                                 exit(-1); 
    1192                         } 
    1193          } 
     1202                        k_err(); // reset err 
     1203                        emailrecipients[nemailrecipients].fullMsg = ( msgType!='C' ); 
     1204                        nemailrecipients++; 
     1205                } 
     1206                else 
     1207                { 
     1208                        logit("e", "ewhtmlemail: Excessive number of email recipients. Exiting.\n"); 
     1209                        exit(-1); 
     1210                } 
     1211        } 
    11941212    /*NR*/else if (k_its ("DefineRegion")) 
    11951213          { 
     
    12101228                } 
    12111229            } 
    1212             strcpy( EmailReg[numRegions].name, str ); 
     1230                strcpy( EmailReg[numRegions].name, str ); 
    12131231 
    12141232            num_sides = k_int (); 
     
    13861404void InsertHeaderTable(FILE *htmlfile, HypoArc *arc, MAG_INFO *mag, MAG_INFO *mag_w, char Quality) { 
    13871405        char            timestr[80];                                    /* Holds time messages */ 
    1388         time_t          ot; 
    1389         struct tm       *timeinfo; 
    1390         char            *grname[36];          /* Flinn-Engdahl region name */ 
     1406        time_t          ot; 
     1407        struct tm       *timeinfo; 
     1408        char            *grname[36];          /* Flinn-Engdahl region name */ 
    13911409        struct tm * (*timefunc)(const time_t *); 
    13921410        char            time_type[30] = {0};                                    /* Time type UTC or local */ 
     
    14031421                strftime( short_msg_info.origin_time_str, 80, "%Y/%m/%d %H:%M:%S", timeinfo ); 
    14041422                if ( UseUTC ) 
    1405                     strcat( short_msg_info.origin_time_str, " UTC" ); 
     1423                        strcat( short_msg_info.origin_time_str, " UTC" ); 
    14061424                 
    14071425                // Table header 
     
    14091427                if(strlen(DataCenter) > 0 ) 
    14101428                { 
    1411                     fprintf( htmlfile, "<tr bgcolor=\"000060\"><th><font size=\"1\" face=\"Sans-serif\" color=\"FFFFFF\">Data Center: %s</font><th><tr>\n", DataCenter ); 
    1412                 } 
     1429                        fprintf( htmlfile, "<tr bgcolor=\"000060\"><th><font size=\"1\" face=\"Sans-serif\" color=\"FFFFFF\">Data Center: %s</font><th><tr>\n", DataCenter ); 
     1430                        } 
    14131431                // Event ID 
    14141432                fprintf( htmlfile, "<tr bgcolor=\"000060\"><th><font size=\"1\" face=\"Sans-serif\" color=\"FFFFFF\">EW Event ID: %ld</font><th><tr>\n", arc->sum.qid ); 
     
    14411459                { 
    14421460                // Coda magnitude 
    1443                     fprintf( htmlfile, "<tr bgcolor=\"DDDDFF\"><td><font size=\"1\" face=\"Sans-serif\">Coda Magnitude:</font></td>" 
     1461                        fprintf( htmlfile, "<tr bgcolor=\"DDDDFF\"><td><font size=\"1\" face=\"Sans-serif\">Coda Magnitude:</font></td>" 
    14441462                                "<td><font size=\"1\" face=\"Sans-serif\">N/A %s nobs=None</font></td><tr>\n", 
    14451463                                MAG_TYPE_STRING ); 
     
    14471465                { 
    14481466                // Coda magnitude 
    1449                     fprintf( htmlfile, "<tr bgcolor=\"DDDDFF\"><td><font size=\"1\" face=\"Sans-serif\">Coda Magnitude:</font></td>" 
     1467                        fprintf( htmlfile, "<tr bgcolor=\"DDDDFF\"><td><font size=\"1\" face=\"Sans-serif\">Coda Magnitude:</font></td>" 
    14501468                                "<td><font size=\"1\" face=\"Sans-serif\">%4.1f %s nobs=%d</font></td><tr>\n", 
    14511469                                arc->sum.Mpref, MAG_TYPE_STRING, (int) arc->sum.mdwt ); 
     
    14761494                if( ShowDetail ) 
    14771495                { 
    1478                          
    1479                         // RMS 
     1496                         
     1497                        // RMS 
    14801498                        fprintf( htmlfile, "<tr bgcolor=\"DDDDFF\" class=\"alt\"><td><font size=\"1\" face=\"Sans-serif\">RMS Error:</font></td><td><font size=\"1\" face=\"Sans-serif\">%5.2f s</font></td><tr>\n", 
    14811499                                        arc->sum.rms); 
     
    15181536void InsertShortHeaderTable(FILE *htmlfile, HypoArc *arc, MAG_INFO *mag, MAG_INFO *mag_w, char Quality) { 
    15191537        char            timestr[80];                                    /* Holds time messages */ 
    1520         time_t          ot; 
    1521         struct tm       *timeinfo; 
    1522         char            *grname[36];          /* Flinn-Engdahl region name */ 
     1538        time_t          ot; 
     1539        struct tm       *timeinfo; 
     1540        char            *grname[36];          /* Flinn-Engdahl region name */ 
    15231541        struct tm * (*timefunc)(const time_t *); 
    15241542        char            time_type[30];                                  /* Time type UTC or local */ 
     
    15351553                strftime( short_msg_info.origin_time_str, 80, "%Y/%m/%d %H:%M:%S", timeinfo ); 
    15361554                if ( UseUTC ) 
    1537                     strcat( short_msg_info.origin_time_str, " UTC" ); 
     1555                        strcat( short_msg_info.origin_time_str, " UTC" ); 
    15381556                 
    15391557                // Table header 
     
    15411559                if(strlen(DataCenter) > 0 ) 
    15421560                { 
    1543                     fprintf( htmlfile, 
    1544                                 "<tr bgcolor=\"000060\">" 
    1545                                         "<th colspan=4><font size=\"1\" face=\"Sans-serif\" color=\"FFFFFF\">Data Center: %s</font></th>" 
    1546                                 "</tr>\n", DataCenter ); 
    1547                 } 
     1561                        fprintf( htmlfile, 
     1562                                        "<tr bgcolor=\"000060\">" 
     1563                                                "<th colspan=4><font size=\"1\" face=\"Sans-serif\" color=\"FFFFFF\">Data Center: %s</font></th>" 
     1564                                        "</tr>\n", DataCenter ); 
     1565                        } 
    15481566                // Event ID 
    15491567                fprintf( htmlfile, 
     
    15711589                                        "<td><font size=\"1\" face=\"Sans-serif\">%s %s</font></td>\n", 
    15721590                                timestr, time_type ); 
    1573                 // RMS 
     1591                // RMS 
    15741592                fprintf( htmlfile, 
    15751593                                "<td><font size=\"1\" face=\"Sans-serif\"><b>RMS Error:</b></font></td>" 
     
    17001718        double          endtime = 0;                                    /* End time for all traces */ 
    17011719        double          dur;                                                    /* Duration of the traces */ 
    1702         int             i, pos;                                                 /* Generic counters */ 
    1703         int             gsamples[MAX_GET_SAMP];                 /* Buffer for resampled traces */ 
     1720        int                     i, pos;                                                 /* Generic counters */ 
     1721        int                     gsamples[MAX_GET_SAMP];                 /* Buffer for resampled traces */ 
    17041722        char            chartreq[50000];                                        /* Buffer for chart requests or GIFs */         /* 2013.05.29 for base64 */ 
    17051723        SITE            *sites[MAX_STATIONS];                   /* Selected sites */ 
    17061724        char            phases[MAX_STATIONS][3];                        /* Phase types of each trace */ 
    17071725        double          arrivalTimes[MAX_STATIONS];             /* Arrival times of each trace */ 
    1708         double          residual[MAX_STATIONS];                 /* phase residual */ 
     1726    double              residual[MAX_STATIONS];                 /* phase residual */ 
    17091727        int             coda_lengths[MAX_STATIONS];             /* Coda lengths of each trace */ 
    1710         double          coda_mags[MAX_STATIONS];                /* station coda mags > 0 if used */ 
     1728        double          coda_mags[MAX_STATIONS];                /* station coda mags > 0 if used */ 
    17111729        int             coda_weights[MAX_STATIONS];                     /* Coda Weight codes for each trace */ 
    17121730        int             weights[MAX_STATIONS];                  /* Weight codes for each trace */ 
     
    17181736        char            system_command[MAX_STRING_SIZE];/* System command to call email prog */ 
    17191737        char            kml_filename[MAX_STRING_SIZE];  /* Name of kml file to be generated */ 
    1720 //      FILE            *cssfile;                                               /* CSS File to be embedded in email */ 
    17211738        FILE            *htmlfile;                                              /* HTML file */ 
    17221739        FILE            *csvfile;                                               /* CSV file */ 
    17231740        FILE            *header_file;                                   /* Email header file */ 
    1724 //      char            ch; 
    17251741        time_t          ot, st;                                                 /* Times */ 
    1726         struct tm       *timeinfo; 
    1727 //        char            *basefilename; 
     1742        struct tm       *timeinfo; 
    17281743        char            timestr[80];                                    /* Holds time messages */ 
    17291744        char            fullFilename[250];                              /* Full html file name */ 
     
    17341749        char            giffilename[256];                               /* Name of GIF files */ 
    17351750        gdImagePtr      gif;                                                    /* Pointer for GIF image */ 
    1736         FILE            *giffile;                                               /* GIF file */ 
     1751        FILE            *giffile;                                               /* GIF file */ 
    17371752        int             BACKCOLOR;                                              /* Background color of GIF images */ 
    17381753        int             TRACECOLOR;                                             /* Trace color in GIF images */ 
    1739         int             PICKCOLOR;                                              /* Pick color in GIF images */ 
    1740         char            Quality;                /* event quality */ 
     1754        int             PICKCOLOR;                                              /* Pick color in GIF images */ 
     1755        char            Quality;                /* event quality */ 
    17411756        FILE*           gifHeader;                                              /* Header for GIF attachments with sendmail */ 
    17421757        char            gifHeaderFileName[257];                 /* GIF Header filename */ 
    17431758        unsigned char* gifbuffer; 
    1744         unsigned char*  base64buf; 
    1745         size_t  gifbuflen; 
    1746         size_t  base64buflen; 
    1747 //      char    gifFileName[256]; 
    1748         char    contentID[256]; 
     1759        unsigned char*  base64buf; 
     1760        size_t  gifbuflen; 
     1761        size_t  base64buflen; 
     1762        char    contentID[256]; 
    17491763 
    17501764  int ret, j; 
     
    18071821                { 
    18081822                        logit( "et", "ewhtmlemail: Unable to find %s.%s.%s.%s on the site file\n", 
    1809                         arc->phases[i]->site, 
    1810                         arc->phases[i]->comp, 
    1811                         arc->phases[i]->net, 
    1812                         arc->phases[i]->loc ); 
     1823                                        arc->phases[i]->site, 
     1824                                        arc->phases[i]->comp, 
     1825                                        arc->phases[i]->net, 
     1826                                        arc->phases[i]->loc ); 
    18131827                        continue; 
    18141828                } 
     
    19291943        { 
    19301944        if( Debug ) logit( "ot", "Waveform Durations %d greater " 
    1931                         "than set by MaxDuration %d\n", 
     1945                                "than set by MaxDuration %d\n", 
    19321946                                (int) (endtime - starttime), (int)DurationMax); 
    19331947        endtime = starttime+DurationMax; 
     
    19982012                fprintf( htmlfile, "<html>\n<header>\n<style type=\"text/css\">" ); 
    19992013 
    2000                 /* Copy content of css file to html file 
    2001                  ***************************************/ 
    2002                 /* 
    2003                 if( strlen( StyleFile ) > 0 ) // Check if there is a style file at all 
    2004                 { 
    2005                         if( Debug ) logit( "ot", "Copying css file to html header: %s\n", StyleFile ); 
    2006                         if( cssfile = fopen( StyleFile, "r" ) ) 
    2007                         { 
    2008                                 while( !feof( cssfile ) ) 
    2009                                 { 
    2010                                         ch = getc(cssfile); 
    2011                                         if( ferror( cssfile ) ) 
    2012                                         { 
    2013                                                 if( Debug ) logit( "e", "Read css error\n" ); 
    2014                                                 clearerr( cssfile ); 
    2015                                                 break; 
    2016                                         } 
    2017                                         else 
    2018                                         { 
    2019                                                 if( !feof( cssfile ) ) putc( ch, htmlfile ); 
    2020                                                 if( ferror( htmlfile ) ) 
    2021                                                 { 
    2022                                                         if( Debug ) logit( "e", "Write css error\n" ); 
    2023                                                         clearerr( htmlfile ); 
    2024                                                         break; 
    2025                                                 } 
    2026                                         } 
    2027                                 } 
    2028                                 fclose(cssfile); 
    2029                         } 
    2030                         else 
    2031                         { 
    2032                                 logit("et","Unable to open css file\n"); 
    2033                         } 
    2034                 } 
    2035         */ 
    2036  
    20372014                /* Close style header 
    20382015                 ********************/ 
     
    20442021                /* Open HTML body */ 
    20452022                fprintf( htmlfile, "<body>\n" ); 
    2046                  
    2047                  
    20482023 
    20492024                Quality = ComputeAverageQuality( arc->sum.rms, arc->sum.erh, arc->sum.erz, 
     
    20532028                 *****************************************/ 
    20542029                if (ShortHeader) { 
    2055                         InsertShortHeaderTable(htmlfile, arc, mag_l, mag_w, Quality); 
     2030                                        InsertShortHeaderTable(htmlfile, arc, mag_l, mag_w, Quality); 
    20562031                } else { 
    2057                         InsertHeaderTable(htmlfile, arc, mag_l, mag_w, Quality); 
     2032                                        InsertHeaderTable(htmlfile, arc, mag_l, mag_w, Quality); 
    20582033                } 
    20592034                if ( (csvfile = fopen( csvFilename, "w" )) != NULL ) { 
    2060                     fprintf( csvfile, "%s, %s, %1.4f, %1.4f, %1.1f km, %s ML, %d phases, %c", 
    2061                         short_msg_info.quakeid, short_msg_info.origin_time_str, short_msg_info.lat, 
    2062                         short_msg_info.lon, short_msg_info.depth, short_msg_info.ml_mag, 
    2063                         short_msg_info.num_phases, short_msg_info.quality ); 
    2064                     fclose( csvfile ); 
     2035                        fprintf( csvfile, "%s, %s, %1.4f, %1.4f, %1.1f km, %s ML, %d phases, %c", 
     2036                                short_msg_info.quakeid, short_msg_info.origin_time_str, short_msg_info.lat, 
     2037                                short_msg_info.lon, short_msg_info.depth, short_msg_info.ml_mag, 
     2038                                short_msg_info.num_phases, short_msg_info.quality ); 
     2039                        fclose( csvfile ); 
    20652040                } 
    20662041 
     
    20722047                         if( Debug ) logit( "ot", "Computing GMT map\n" ); 
    20732048                         if((i=gmtmap(chartreq,sites,nsites,arc->sum.lat,arc->sum.lon,arc->sum.qid)) == 0) 
    2074                                 fprintf(htmlfile, "%s\n<br><br>", chartreq); 
     2049                                fprintf(htmlfile, "%s\n<br><br>", chartreq); 
    20752050                } 
    20762051                 
     
    21352110                                                sites[i]->name, sites[i]->comp, 
    21362111                                                sites[i]->net, sites[i]->loc ); 
     2112                                //TODO: Don't attempt to retrieve data if using EWAVE!! 
    21372113                                if( getWStrbf( buffer, &bsamplecount, sites[i], starttime, endtime ) == -1 ) 
    21382114                                { 
     
    21452121                                 
    21462122                                 
    2147                                 /* Produce traces GIF or google chart 
    2148                                  ************************************/ 
    2149                                 if( UseGIF ) 
     2123                                /* Produce traces using EWAVE plotting service, drawing GIF or using Google Chart 
     2124                                 *********************************************************************************/ 
     2125                                if ( UseEWAVE ) 
     2126                                { 
     2127                                        ot = (time_t) arrivalTimes[i]; 
     2128                                        if (writePlotRequest(chartreq, strlen(chartreq), arc->sum.qid, ewaveAddr, ewavePort, 
     2129                                                                                sites[i]->net, sites[i]->name, sites[i]->loc, sites[i]->comp, 
     2130                                                                                st, (int)dur, ot, phases[i]) < 0) 
     2131                                        { 
     2132                                                //this is an error! 
     2133                                                logit( "et", "Unable to write request for EWAVE plot of %s.%s.%s.%s", 
     2134                                                                                sites[i]->net, sites[i]->name, sites[i]->loc, sites[i]->comp); 
     2135                                                continue; 
     2136                                        } 
     2137                                } 
     2138                                else if( UseGIF ) 
    21502139                                { 
    21512140                                 
     
    21842173                                         
    21852174                                         
    2186                                          
    2187                                          
    2188                                         /* Open gif file */ 
    2189                                         sprintf( giffilename, "%s_%ld_%s.%s.%s.%s_%s.gif", 
     2175                                        /* Open gif file */ 
     2176                                        sprintf( giffilename, "%s_%ld_%s.%s.%s.%s_%s.gif", 
    21902177                                                        HTMLFile, arc->sum.qid, 
    21912178                                                        sites[i]->name, sites[i]->comp, 
    21922179                                                        sites[i]->net, sites[i]->loc, phases[i] ); 
    2193                                         giffile = fopen( giffilename, "wb+" ); 
    2194                                         if (giffile == NULL) { 
     2180                                        giffile = fopen( giffilename, "wb+" ); 
     2181                                        if (giffile == NULL) { 
    21952182                                                logit( "e", "ewhtmlemail: Unable to create gif image " 
    21962183                                                                "for %s.%s.%s.%s as a file: %s\n", 
     
    21992186                                                continue; 
    22002187                                        } 
    2201                                          
    2202                                         /* Save gif to file */ 
    2203                                         gdImageGif( gif, giffile ); 
    2204                                          
    2205                                         if( !UseBlat ) 
    2206                                         { 
    2207                                                 /* The gif must be converted to base64 */ 
    2208                                          
    2209                                                 /* Rewind stream */ 
    2210                                                 rewind( giffile ); 
    2211                                          
    2212                                                 /* Allocate memory for reading from file */ 
    2213                                                 gifbuflen = ( size_t )( gif->sx * gif->sy ); 
    2214                                                 gifbuffer = ( unsigned char* ) malloc( 
    2215                                                                 sizeof( unsigned char ) * gifbuflen ); 
    2216                                          
    2217                                                 /* Read gif from file */ 
    2218                                                 gifbuflen = fread( gifbuffer, sizeof( unsigned char ), 
    2219                                                                 gifbuflen, giffile ); 
    2220                                          
    2221                                                 /* Encode to base64 */ 
    2222                                                 base64buf = base64_encode( (size_t *) &base64buflen, 
    2223                                                                 gifbuffer, gifbuflen ); 
    2224                                          
    2225                                                 /* Free gif buffer */ 
    2226                                                 free( gifbuffer ); 
    2227                                          
    2228                                                 /* Compute a content ID for this image */ 
    2229                                                 sprintf( contentID, "%s_%s_%s_%s_%s", 
     2188                                         
     2189                                        /* Save gif to file */ 
     2190                                        gdImageGif( gif, giffile ); 
     2191                                         
     2192                                        if( !UseBlat ) 
     2193                                        { 
     2194                                                /* The gif must be converted to base64 */ 
     2195                                         
     2196                                                /* Rewind stream */ 
     2197                                                rewind( giffile ); 
     2198                                         
     2199                                                /* Allocate memory for reading from file */ 
     2200                                                gifbuflen = ( size_t )( gif->sx * gif->sy ); 
     2201                                                gifbuffer = ( unsigned char* ) malloc( 
     2202                                                                sizeof( unsigned char ) * gifbuflen ); 
     2203                                         
     2204                                                /* Read gif from file */ 
     2205                                                gifbuflen = fread( gifbuffer, sizeof( unsigned char ), 
     2206                                                                gifbuflen, giffile ); 
     2207                                         
     2208                                                /* Encode to base64 */ 
     2209                                                base64buf = base64_encode( (size_t *) &base64buflen, 
     2210                                                                gifbuffer, gifbuflen ); 
     2211                                         
     2212                                                /* Free gif buffer */ 
     2213                                                free( gifbuffer ); 
     2214                                         
     2215                                                /* Compute a content ID for this image */ 
     2216                                                sprintf( contentID, "%s_%s_%s_%s_%s", 
    22302217                                                                sites[i]->name, sites[i]->comp, 
    22312218                                                                sites[i]->net, sites[i]->loc, phases[i] ); 
    22322219                                                 
    2233                                                 /* Write base64 attachment to gif header file */ 
    2234                                                 fprintf( gifHeader, "--FILEBOUNDARY\n" 
    2235                                                                 "Content-Type: image/gif\n" 
     2220                                                /* Write base64 attachment to gif header file */ 
     2221                                                fprintf( gifHeader, "--FILEBOUNDARY\n" 
     2222                                                                "Content-Type: image/gif\n" 
    22362223                                                                "Content-Disposition: inline\n" 
    22372224                                                                "Content-Transfer-Encoding: base64\n" 
     
    22402227                                                 
    22412228                                                /* Free base64 buffer */ 
    2242                                                 free( base64buf ); 
    2243                                          
    2244                                                 /* Create img request */ 
    2245                                                 sprintf( chartreq, 
    2246                                                                 "<img class=\"MapClass\" alt=\"\" src=\"cid:%s\">", 
    2247                                                                 contentID ); 
    2248                                         } 
    2249                                         else 
    2250                                         { 
    2251                                                 //TODO: Investigate blat attachment references 
    2252                                                 /* Create img request */ 
    2253                                                 sprintf( chartreq, 
    2254                                                                 "<img class=\"MapClass\" alt=\"\" src=\"cid:%s\">", 
    2255                                                                 contentID ); 
    2256                                         } 
    2257                                         /* Close gif file */ 
    2258                                         fclose( giffile ); 
    2259                                          
    2260                                          
    2261                                          
    2262                                          
    2263  
    2264                                         /* Save gif file 
    2265                                          ***************/ 
    2266                                         /* 
    2267                                         sprintf( giffilename, "%s_%ld_%s.%s.%s.%s.gif", 
    2268                                         HTMLFile, arc->sum.qid, 
    2269                                                         sites[i]->name, sites[i]->comp, 
    2270                                                         sites[i]->net, sites[i]->loc ); 
    2271                                         if( ( giffile = fopen( giffilename, "w" ) ) != NULL ) 
    2272                                         { 
    2273                                                 if( Debug ) logit( "o", "Saving gif file: %s\n", giffilename ); 
    2274                                                                 gdImageGif( gif, giffile ); 
    2275                                                                 fclose( giffile ); 
     2229                                                free( base64buf ); 
     2230                                         
     2231                                                /* Create img request */ 
     2232                                                sprintf( chartreq, 
     2233                                                                "<img class=\"MapClass\" alt=\"\" src=\"cid:%s\">", 
     2234                                                                contentID ); 
    22762235                                        } 
    22772236                                        else 
    22782237                                        { 
    2279                                                 logit( "e", "ewhtmlemail: Unable to save gif file: %s\n", 
    2280                                                                 giffilename ); 
    2281                                                 gdImageDestroy(gif); 
    2282                                                 continue; 
     2238                                                //TODO: Investigate blat attachment references 
     2239                                                /* Create img request */ 
     2240                                                sprintf( chartreq, 
     2241                                                                "<img class=\"MapClass\" alt=\"\" src=\"cid:%s\">", 
     2242                                                                contentID ); 
    22832243                                        } 
    2284                                         */ 
    2285  
     2244                                        /* Close gif file */ 
     2245                                        fclose( giffile ); 
     2246                                         
    22862247                                        // free gif from memory 
    22872248                                        gdImageDestroy(gif); 
    2288                                  
    2289  
    2290                                         /* Create request for gif file 
    2291                                          *****************************/ 
    2292 //#ifdef _WINNT 
    2293                                         /* we need a windows equivalent (basename() is POSIX only). */ 
    2294 //                                      basefilename = giffilename; 
    2295 //#else 
    2296 //                                      basefilename = (char*)basename( giffilename ); 
    2297 //#endif 
    2298 /*                                      if (strlen(basefilename) > MAX_GET_CHAR) 
    2299                                         { 
    2300                                                 logit( "et", "Warning, basefilename too large for <img> tag, only %d chars allowed and basefilename is %d chars\n" , MAX_GET_CHAR, strlen(basefilename)); 
    2301                                         } 
    2302                                         //sprintf( chartreq, 
    2303                                         //              "<img class=\"MapClass\" alt=\"\" src=\"%s\">", 
    2304                                         //              basefilename ); 
    2305                                         */ 
    23062249                                } 
    23072250                                else 
     
    23102253                                        /* Produce Google trace 
    23112254                                         **********************/ 
    2312  
    23132255 
    23142256                                        /* Resample trace 
     
    23842326                        fprintf(htmlfile, "</table>\n"); 
    23852327                 
    2386                     } // End of Traces section 
     2328                        } // End of Traces section 
    23872329                } // end of no traces check 
    23882330 
     
    24872429                        for( i=0; i<nemailrecipients; i++ )// One email for each recipient 
    24882430                        { 
    2489                             if (((emailrecipients[i].min_magnitude <= arc->sum.Mpref && DontUseMd == 0) || 
     2431                                if (((emailrecipients[i].min_magnitude <= arc->sum.Mpref && DontUseMd == 0) || 
    24902432                                 (UseML && mag_l != NULL && emailrecipients[i].min_magnitude <= mag_l->mag ) || 
    24912433                                 (UseML && mag_l == NULL && emailrecipients[i].min_magnitude == DUMMY_MAG))  && 
    24922434                                (distance_from_center <= emailrecipients[i].max_distance) ) 
    2493                             { 
    2494  
    2495                             // Final check against regions 
    2496                             sendit = (emailrecipients[i].num_regions > 0 ? FALSE : TRUE); 
    2497                             for ( j=0; j<emailrecipients[i].num_regions; j++ ) { 
    2498                                 int regID = emailrecipients[i].region_ids[j]; 
    2499                                 int realRegID = regID<0 ? regID+10 : regID; 
    2500                                 geom_area (&ret, EmailReg[realRegID].num_sides,  EmailReg[realRegID].x, 
     2435                                { 
     2436 
     2437                                // Final check against regions 
     2438                                sendit = (emailrecipients[i].num_regions > 0 ? FALSE : TRUE); 
     2439                                for ( j=0; j<emailrecipients[i].num_regions; j++ ) { 
     2440                                        int regID = emailrecipients[i].region_ids[j]; 
     2441                                        int realRegID = regID<0 ? regID+10 : regID; 
     2442                                        geom_area (&ret, EmailReg[realRegID].num_sides,  EmailReg[realRegID].x, 
    25012443                                 EmailReg[realRegID].y, &lat, &lon); 
    25022444                                if ( ret==1 ) { 
    25032445                                  if ( regID==realRegID ) { 
    2504                                     sendit = TRUE; 
     2446                                        sendit = TRUE; 
    25052447                                  } else { 
    2506                                     sendit = FALSE; 
    2507                                     break; 
     2448                                        sendit = FALSE; 
     2449                                        break; 
    25082450                                  } 
    25092451                                } 
    2510                             } 
    2511                             if ( !sendit ) { 
    2512                               logit("et", "ewhtmlemail: No email sent to %s because not in specified region\n", 
    2513                                     emailrecipients[i].address ); 
    2514                               continue; 
    2515                             } 
     2452                                } 
     2453                                if ( !sendit ) { 
     2454                                  logit("et", "ewhtmlemail: No email sent to %s because not in specified region\n", 
     2455                                        emailrecipients[i].address ); 
     2456                                  continue; 
     2457                                } 
    25162458                                if( UseBlat )           // Use blat for sending email 
    25172459                                { 
     
    26012543                                        logit("et", "ewhtmlemail: Debug; EmailCommand issued '%s'\n", system_command); 
    26022544                                } 
    2603                             } 
    2604                             else 
    2605                             { 
     2545                                } 
     2546                                else 
     2547                                { 
    26062548                                /* this person doesn't get the email, Both Local (if used) or  Coda mag too low */ 
    26072549                                if (emailrecipients[i].max_distance != OTHER_WORLD_DISTANCE_KM && 
     
    26122554                                } 
    26132555                                else if (UseML && mag_l != NULL && emailrecipients[i].min_magnitude > mag_l->mag ) 
    2614                                 { 
     2556                                { 
    26152557                                        logit("et", "ewhtmlemail: No email sent to %s because ML %5.2f and Md %5.2f are  lower than requested threshold %4.1f\n", 
    26162558                                        emailrecipients[i].address, mag_l->mag, arc->sum.Mpref, emailrecipients[i].min_magnitude); 
    26172559                                } 
    26182560                                else if (DontUseMd == 0 && emailrecipients[i].min_magnitude > arc->sum.Mpref) 
    2619                                 { 
     2561                                { 
    26202562                                        logit("et", "ewhtmlemail: No email sent to %s because Md %5.2f lower than requested threshold %4.1f\n", 
    26212563                                        emailrecipients[i].address, arc->sum.Mpref, emailrecipients[i].min_magnitude); 
    26222564                                } 
    2623                             } 
     2565                                } 
    26242566                        } 
    26252567                } 
     
    26972639 
    26982640   if (!DontShowStationsOnMap) { 
    2699         /* Add icons for stations 
    2700         ************************/ 
     2641        /* Add icons for stations 
     2642                ************************/ 
    27012643       /* 
    2702         snprintf( temp, MAX_GET_CHAR, "%s&markers=icon:http:%%2F%%2Fmaps.google.com%%2Fmapfiles" 
    2703                 "%%2Fkml%%2Fshapes%%2Fplacemark_circle.png|shadow:false", map_query ); 
     2644        snprintf( temp, MAX_GET_CHAR, "%s&markers=icon:http:%%2F%%2Fmaps.google.com%%2Fmapfiles" 
     2645                        "%%2Fkml%%2Fshapes%%2Fplacemark_circle.png|shadow:false", map_query ); 
    27042646            use URL encoding for | symbols now  */ 
    2705         snprintf( temp, MAX_GET_CHAR, "%s&markers=icon:http:%%2F%%2Fmaps.google.com%%2Fmapfiles" 
    2706                 "%%2Fkml%%2Fshapes%%2Fplacemark_circle.png%%7Cshadow:false", map_query ); 
     2647        snprintf( temp, MAX_GET_CHAR, "%s&markers=icon:http:%%2F%%2Fmaps.google.com%%2Fmapfiles" 
     2648                        "%%2Fkml%%2Fshapes%%2Fplacemark_circle.png%%7Cshadow:false", map_query ); 
    27072649        strcpy(map_query, temp); 
    2708         for( i = 0; i < nsites && stations_plotted < MAX_GE_MARKERS; i++ ) 
    2709         { 
    2710           /* snprintf( temp, MAX_GET_CHAR, "%s|%f,%f", map_query, sites[i]->lat, sites[i]->lon ); */ 
     2650        for( i = 0; i < nsites && stations_plotted < MAX_GE_MARKERS; i++ ) 
     2651        { 
     2652                  /* snprintf( temp, MAX_GET_CHAR, "%s|%f,%f", map_query, sites[i]->lat, sites[i]->lon ); */ 
    27112653          /* use URL encoding now */ 
    27122654          if (i> 0 && strcmp(sites[i]->name, sites[i-1]->name) == 0 && 
     
    27142656                continue; /* same net and sta, already plotted */ 
    27152657          } 
    2716           snprintf( temp, MAX_GET_CHAR, "%s%%7C%f%%2C%f", map_query, sites[i]->lat, sites[i]->lon ); 
     2658                  snprintf( temp, MAX_GET_CHAR, "%s%%7C%f%%2C%f", map_query, sites[i]->lat, sites[i]->lon ); 
    27172659          strcpy(map_query, temp); 
    27182660          stations_plotted++; 
    2719         } 
     2661        } 
    27202662        logit("t", "ewhtmlemail: map-query plotted %d stations\n", stations_plotted); 
    27212663   } 
     
    27312673        logit("t", "ewhtmlemail: map_query is %zu bytes long\n", strlen((const char *) map_query)); 
    27322674        logit("t", "ewhtmlemail: signature_encoded is %zu bytes long\n", strlen((const char *) signature_encoded)); 
    2733         snprintf( temp, MAX_GET_CHAR, "%s&signature=%s", map_query, signature_encoded ); 
     2675                snprintf( temp, MAX_GET_CHAR, "%s&signature=%s", map_query, signature_encoded ); 
    27342676        free(signature_encoded); 
    27352677        strcpy(map_query, temp); 
     
    27442686} 
    27452687 
     2688/********************************************************************************************** 
     2689 * writePlotRequest: 
     2690 *      formats request to Flask EW plotter given a minimum of SNCL, starttime and duration  
     2691 *      of trace to be plotted 
     2692 * 
     2693 *      optionally takes pick time and pick label, and boolean value to request plotting of 
     2694 *      maximum value  
     2695 * 
     2696 *      writes formatted request into the string buffer 'plotRequest' 
     2697 *      returns 0 if successful, -1 otherwise 
     2698 *********************************************************************************************/ 
     2699int writePlotRequest(char *plotRequest, size_t requestLen, long eventId, char *address, char *port, 
     2700                                        char *network, char *station, char *location, char *channel, 
     2701                                        time_t startTime, int duration, time_t pickTime, char *pickLabel) 
     2702                                        //int numOptions, ... ) 
     2703{ 
     2704        struct tm *tPtr; 
     2705        char startTimeStr[20]; 
     2706        char pickTimeStr[20]; 
     2707        char requestURL[250];           /* Buffer to hold request for plot from EWAVE */ 
     2708        int formatStringLen = 0; 
     2709 
     2710        tPtr = gmtime(&startTime); 
     2711        strftime(startTimeStr, 20, "%FT%T", tPtr); 
     2712 
     2713        tPtr = gmtime(&pickTime); 
     2714        strftime(pickTimeStr, 20, "%FT%T", tPtr); 
     2715 
     2716        if ((address == NULL) || (port == NULL)) { 
     2717                return -1; 
     2718        } 
     2719 
     2720        formatStringLen = snprintf(requestURL, 250, 
     2721                                        "http://%s:%s/ewave/query?net=%s&sta=%s&cha=%s&loc=%s&start=%s&dur=%d&ptime=%s&plabel=%s (%s)", 
     2722                                        address, port, network, station, channel, location, startTimeStr, duration, pickTimeStr, pickLabel, pickTimeStr); 
     2723        if ( formatStringLen <= 0 ) { 
     2724                if (Debug) logit( "et", "Unable to format request to EWAVE\n"); 
     2725                return -1; 
     2726        } 
     2727        formatStringLen = snprintf(plotRequest, requestLen, 
     2728                                "<td><div style=\"float:left;overflow:hidden\">\n" 
     2729                                "\t<img alt=\"Trace\" title=\"Trace\" style=\"display:block\"" 
     2730                                "src=\"%s\"/>\n</div></td>\n", requestURL); 
     2731 
     2732        if ( formatStringLen <= 0 ) { 
     2733                if (Debug) logit( "et", "failed to write image file name\n"); 
     2734                return -1; 
     2735        } 
     2736 
     2737        return 0; 
     2738} 
    27462739 
    27472740/******************************************************************************* 
    2748  * makeGoogleChartRequest: Produce a google chart request for a given station  * 
     2741 * makeGoogleChart: Produce a google chart request for a given station  * 
    27492742 ******************************************************************************/ 
    27502743 /* 
     
    27852778         ************************************************************/ 
    27862779 
    2787         ntraces = ( ( int )( samplecount %      MAX_REQ_SAMP ) == 0 )? 
     2780        ntraces = ( ( int )( samplecount %      MAX_REQ_SAMP ) == 0 )? 
    27882781                        ( ( int )( samplecount / MAX_REQ_SAMP ) ) : 
    27892782                        ( ( int )( samplecount / MAX_REQ_SAMP ) + 1 ); 
     
    28772870        } 
    28782871         
    2879         /* Create request header 
    2880          ***********************/ 
    2881         /* 
    2882         snprintf(reqHeader, MAX_GET_CHAR, "<img class=\"TraceClass\" alt=\"\" " 
    2883                         "src=\"http://chart.apis.google.com/chart?" 
    2884                         "chs=%dx%d&" 
    2885                         "cht=ls&" 
    2886                         "chxt=x&" 
    2887                         "chxl=0:|%c&" 
    2888                         "chxp=0,%3.1f&" 
    2889                         "chxtc=0,-600&" 
    2890                         "chco=000060&" 
    2891                         "chma=0,0,0,0&" 
    2892                         "chls=1&"                               // Linewidth 
    2893                         "chd=s:", 
    2894                         tracewidth, traceheight, phasename, phasepos); 
    2895         */ 
    2896          
    2897         /* Add samples to request 
    2898          ************************/ 
    2899         /* 
    2900         for( i = 0; i < samplecount  && i < ( MAX_GET_CHAR - 1 ); i++ ) 
    2901                 reqSamples[i] = simpleEncode( ( int )( ( double ) samples[i] - avg + 30.5 ) ); 
    2902         reqSamples[samplecount] = '\0'; 
    2903         */ 
    2904  
    2905         /* Combine header and samples 
    2906          ****************************/ 
    2907         /* 
    2908         snprintf( chartreq, MAX_GET_CHAR, "%s%s\"/>", reqHeader, reqSamples ); 
    2909         */ 
    2910  
    29112872        return 1; 
    29122873} 
     
    29622923                double starttime, double endtime ) 
    29632924{ 
    2964         WS_MENU_QUEUE_REC       menu_queue; 
    2965         TRACE_REQ                       trace_req; 
    2966         int                             wsResponse; 
     2925        WS_MENU_QUEUE_REC       menu_queue; 
     2926        TRACE_REQ                       trace_req; 
     2927        int                                     wsResponse; 
    29672928        int                                     atLeastOne; 
    29682929        int                                     i; 
     
    30252986                logit( "et", "ewhtmlemail: Error loading data from waveserver - %s\n", 
    30262987                                getWSErrorStr(wsResponse, WSErrorMsg)); 
    3027                 wsKillMenu(&menu_queue); 
     2988                        wsKillMenu(&menu_queue); 
    30282989                return -1; 
    30292990        } 
     
    30953056                double starttime, double endtime, int outamp ) 
    30963057{ 
    3097         TRACE2_HEADER   *trace_header,*trace;           // Pointer to the header of the current trace 
     3058        TRACE2_HEADER   *trace_header,*trace;           // Pointer to the header of the current trace 
    30983059        char                    *trptr;                         // Pointer to the current sample 
    30993060        double                  inrate;                         // Initial sampling rate 
     
    31103071        int                             samppos = 0;            // Position of the sample in the array; 
    31113072        double                  sr;                                             // buffer sample rate 
    3112         int                     isBroadband;            // Broadband=TRUE - ShortPeriod = FALSE 
    3113         int                     flag;            
     3073        int                             isBroadband;            // Broadband=TRUE - ShortPeriod = FALSE 
     3074        int                             flag;            
    31143075        double                  y;                              // temp int to hold the filtered sample  
    31153076        RECURSIVE_FILTER rfilter;     // recursive filter structure 
    3116         int                     maxfilters=20; 
     3077        int                             maxfilters=20; 
    31173078 
    31183079         
     
    31233084        { 
    31243085                logit( "et", "ewhtmlemail: Unable to reserve memory for resampled signal\n" ); 
    3125         return -1; 
     3086                return -1; 
    31263087        } 
    31273088         
     
    31343095        { 
    31353096                logit( "et", "ewhtmlemail: Unable to allocate memory for sample buffer\n" ); 
    3136         return -1; 
     3097                return -1; 
    31373098        } 
    31383099        for( i = 0; i < MAX_SAMPLES; i++ ) samples[i] = 0.0; 
     
    31663127        { 
    31673128                // If necessary, swap bytes in tracebuf message 
    3168         if ( WaveMsg2MakeLocal( trace_header ) < 0 ) 
    3169         { 
     3129                if ( WaveMsg2MakeLocal( trace_header ) < 0 ) 
     3130                { 
    31703131                        logit( "et", "ewhtmlemail(trbufresample): WaveMsg2MakeLocal error.\n" ); 
    3171                 return -1; 
     3132                        return -1; 
    31723133                } 
    31733134                 
     
    32063167                        outavg += s; 
    32073168                } 
    3208         }                
     3169        }                
    32093170         
    32103171        if(SPfilter && isBroadband) 
     
    32923253                { 
    32933254                        logit( "et", "ewhtmlemail: Unable to allocate memory for filter buffer\n" ); 
    3294                 return -1; 
     3255                        return -1; 
    32953256                } 
    32963257                for( i = 0; i < nb; i++ ) 
     
    32993260                 
    33003261                /* Filter signal with array buffer 
    3301                  *********************************/ 
    3302                 for( i = 0; i < nsamples; i++ ) 
    3303                         samples[i] = fbuffer_add( fbuffer, nb, samples[i] ); 
    3304                  
    3305                 /* Done with filter buffer 
    3306                  *************************/ 
    3307                 free( fbuffer ); 
     3262                 *********************************/ 
     3263                for( i = 0; i < nsamples; i++ ) 
     3264                        samples[i] = fbuffer_add( fbuffer, nb, samples[i] ); 
     3265                 
     3266                /* Done with filter buffer 
     3267                 *************************/ 
     3268                free( fbuffer ); 
    33083269        } 
    33093270        else 
     
    34073368                int fcolor, int bcolor ) 
    34083369{ 
    3409         TRACE2_HEADER   *trace_header,*trace;   // Pointer to the header of the current trace 
     3370        TRACE2_HEADER   *trace_header,*trace;   // Pointer to the header of the current trace 
    34103371        char                    *trptr;                 // Pointer to the current sample 
    34113372        double                  sampavg;                // To compute average value of the samples 
    34123373        int                     nsampavg=0;             // Number of samples considered for the average 
    34133374        double                  sampmax;                // To compute maximum value 
    3414         int                     i;                              // General purpose counter 
    3415         gdPointPtr              pol;                    // Polygon pointer 
     3375        int                             i;                              // General purpose counter 
     3376        gdPointPtr              pol;                    // Polygon pointer 
    34163377        int                             npol;                   // Number of samples in the polygon 
    34173378        double                  xscale;                 // X-Axis scaling factor 
    34183379        double                  dt;                             // Time interval between two consecutive samples 
    3419         double          sr;                     // to hold the sample rate obtained through the trace_header struc. 
    3420         int                     isBroadband;    // Broadband= TRUE - ShortPeriod = FALSE 
    3421         int                     flag;            
     3380        double          sr;                             // to hold the sample rate obtained through the trace_header struc. 
     3381        int                             isBroadband;    // Broadband= TRUE - ShortPeriod = FALSE 
     3382        int                             flag;            
    34223383        int                             y;                              // temp int to hold the filtered sample  
    34233384        RECURSIVE_FILTER rfilter;     // recursive filter structure 
     
    34293390        { 
    34303391                logit( "et", "trbf2gif: Unable to reserve memory for plotting trace.\n" ); 
    3431         return -1; 
     3392                return -1; 
    34323393        } 
    34333394        npol = 0; 
     
    34523413         
    34533414                // If necessary, swap bytes in tracebuf message 
    3454         if ( WaveMsg2MakeLocal( trace_header ) < 0 ) 
    3455         { 
     3415                if ( WaveMsg2MakeLocal( trace_header ) < 0 ) 
     3416                { 
    34563417                        logit( "et", "trbf2gif(trb2gif): WaveMsg2MakeLocal error.\n" ); 
    34573418                        free( pol ); 
    3458             return -1; 
     3419                        return -1; 
    34593420                } 
    34603421                 
     
    34893450                if( strcmp( trace_header->datatype, "i2" ) == 0 || 
    34903451                                strcmp(trace_header->datatype, "s2")==0 ) 
    3491             { 
    3492                 // Short samples 
     3452                { 
     3453                        // Short samples 
    34933454                        for( i = 0; i < trace_header->nsamp; i++, npol++, trptr += 2 ) 
    34943455                        { 
    34953456                                // Compute x coordinate 
    34963457                                pol[npol].x = ( int )( ( trace_header->starttime - starttime + 
    3497                                         ( double ) i * dt ) * xscale ); 
    3498                          
    3499                         // Compute raw y coordinate without scaling or de-averaging 
     3458                                                ( double ) i * dt ) * xscale ); 
     3459                                 
     3460                                // Compute raw y coordinate without scaling or de-averaging 
    35003461                                pol[npol].y = ( int ) (*((short*)(trptr))); 
    35013462                                 
     
    35113472                                strcmp(trace_header->datatype, "s4")==0 ) 
    35123473                { 
    3513                 // Integer samples 
     3474                        // Integer samples 
    35143475                        for( i = 0; i < trace_header->nsamp; i++, npol++, trptr += 4 ) 
    35153476                        { 
    35163477                                // Compute x coordinate 
    35173478                                pol[npol].x = ( int )( ( trace_header->starttime - starttime + 
    3518                                         ( double ) i * dt ) * xscale ); 
    3519                          
    3520                         // Compute raw y coordinate without scaling or de-averaging 
     3479                                                ( double ) i * dt ) * xscale ); 
     3480                                 
     3481                                // Compute raw y coordinate without scaling or de-averaging 
    35213482                                pol[npol].y = *((int*)(trptr)); 
    35223483                                 
     
    35383499                        logit( "et", "trbf2gif: Unknown type of samples\n" ); 
    35393500                        free( pol ); 
    3540             return -1; 
     3501                        return -1; 
    35413502                } 
    35423503                // At this point, the polygon is populated with samples from this trace 
     
    38823843        typedef unsigned __int32 uint32_t; 
    38833844#endif 
    3884         uint32_t        octet_a, octet_b, octet_c, triple; 
     3845        uint32_t        octet_a, octet_b, octet_c, triple; 
    38853846        unsigned char* encoded_data; 
    38863847         
  • branches/cosmos/src/reporting/ewhtmlemail/ewhtmlemail.d

    r7763 r8041  
    199199 MaxDuration    60.0   # defaults to 144 seconds, new feature 
    200200 
     201 # EWAVE: a RESTful plotting service, optional (instead of Google Trace API or GIF) 
     202 # Uncomment the following parameters to use it 
     203 # EwaveAddr   127.0.0.1 
     204 # EwavePort     5000 
    201205 
    202206 #UseGIF                                # Not yet functional 
  • branches/cosmos/src/reporting/gmewhtmlemail/gmewhtmlemail.c

    r7923 r8041  
    1 //#define TestMode 
    21/****************************************************************************** 
    32 *                                GMEWHTMLEMAIL                               * 
     
    3130 *****************************************************************************/ 
    3231 
    33 #define VERSION_STR "1.7.12 - 2018-08-16" 
     32#define VERSION_STR "1.8.2a - 2019-06-14" 
    3433 
    3534#define MAX_STRING_SIZE 1024    /* used for many static string place holders */ 
     
    8180 *********/ 
    8281#define MAX_STATIONS 200 
     82#define MAX_STREAMS 1024        /* Max number of stream conversion factors to process */ 
    8383#define MAX_GET_SAMP 2400       /* Number of samples in a google chart */ 
    8484#define MAX_REQ_SAMP 600        /* Maximum number of samples per google request */ 
     
    8686#define MAX_POL_LEN 120000      /* Maximum number of samples in a trace gif */ 
    8787#define MAX_WAVE_SERVERS 10 
     88#define MAX_COLOR_PGAS 10 
    8889#define MAX_ADDRESS 80 
    8990#define MAX_PORT 6 
     
    131132    uint16_t subDams[MAX_SUB_DAMS]; 
    132133    int shouldSendEmail;         //flag indicating whether or not email is to be sent to this address 
    133 //     char subRegion[MAX_REGIONS]; 
    134 //     char subArea[MAX_AREAS]; 
    135134} EMAILREC; 
    136135 
     
    148147    int     idx; 
    149148} SiteOrder; 
     149 
     150typedef struct SNCLConv { 
     151        char SNCL[20]; 
     152        double convFactor; 
     153} Conv; 
    150154 
    151155typedef struct dam_info { 
     
    188192void GoogleMapRequest(char*, SITE**, int, double, double, HypoArcSM2*, SiteOrder*, SiteOrder* ); 
    189193void MapQuestMapRequest(char*, SITE**, int, double, double, HypoArcSM2*, SiteOrder*, SiteOrder* ); 
    190 //void GoogleChartRequest(char *request, SITE **sites, int nsites, double *distances ); 
    191 //void GoogleChartRequest(char*, int*, double*, int, int, char, int); 
    192194char simpleEncode(int); 
    193195int searchSite(char*, char*, char*, char*); 
     
    196198int trbufresample( int*, int, char*, int, double, double, int, double* ); 
    197199double fbuffer_add( double*, int, double ); 
     200int createGifPlot(char *chartreq, HypoArc *arc, char *buffer, int bsamplecount, SITE *waveSite, double starttime, double endtime, char phaseName[2]); 
     201int writePlotRequest(char *, size_t, long, char *, char *, char *, char *, char *, char *, time_t, int);  
    198202int makeGoogleChart( char*, int*, int, char *, double, int, int, double* ); 
    199203void gdImagePolyLine( gdImagePtr, gdPointPtr, int, int ); 
     
    203207void InsertShortHeaderTable(FILE *htmlfile, HypoArc *arc, char Quality); 
    204208void InsertHeaderTable(FILE *htmlfile, HypoArc *arc, char Quality, int showDM, char *, SM_INFO*); 
     209int InsertStationTable(FILE *, char, int, SiteOrder*, SITE**, SM_INFO **, int *, SiteOrder*, double*); 
     210int InsertDamTable(FILE *htmlfile, HypoArc *arc, double *max_epga_g); 
    205211unsigned char* base64_encode( size_t* output_length, const unsigned char *data, size_t input_length ); 
    206212double deg2rad(double deg); 
     
    213219int shouldSendEmail( int i, double distance_from_center, HypoArc *arc, HypoArcSM2 *arcsm, uint32_t subRegionsUsed, uint64_t subAreasUsed ); 
    214220void prepare_dam_info( HypoArc *arc, char* regionsStr, char* regionsUsed, uint32_t* subRegionsUsed, uint64_t* subAreasUsed ); 
    215  
     221int conversion_read(char *path); 
    216222 
    217223/* Globals 
     
    238244static char       KMLpreamble[MAX_STRING_SIZE];          // where to find the KML preamble needed for this. 
    239245static int        nwaveservers = 0;       // Number of waveservers 
     246static int        ncolorpga = 0;          // Number of color PGA values 
    240247static int        nemailrecipients = 0;   // Number of email recipients 
    241248static int        nStaticEmailRecipents = 0; 
     
    289296static int        MaxFacilitiesInTable = -1; 
    290297static double     IgnorePGABelow = 0.01; 
     298static Conv       ConversionFactors[MAX_STREAMS] = {0}; 
    291299 
    292300//static char       dam_info_kind = 0; 
     
    297305static int        TraceHeight = 61;        // Height of the GIF files 
    298306 
     307static int        UseEWAVE = 0;                 //Use the EWAVE plotting service to generate images 
     308static char       ewaveAddr[64]; 
     309static char       ewavePort[16]; 
     310 
     311//Option to restrict thresholds to a particular network: 
     312static int               RestrictThresholds = 0; 
     313static char      RestrictedNetwork[8] = {0}; 
     314 
    299315// Array of waveservers 
    300316static WAVESERV   waveservers[MAX_WAVE_SERVERS]; 
     317// Array of Color PGA values and colors 
     318static double colorpga_values[MAX_COLOR_PGAS]; 
     319static char   colorpga_colors[MAX_COLOR_PGAS][MAX_STRING_SIZE]; 
    301320// Array of email recipients 
    302321static EMAILREC   *emailrecipients = NULL; 
    303  
    304 #ifdef TestMode 
    305 int NumSeg = 0; 
    306 int NumFakeSites = 0; 
    307 #endif 
    308  
    309322 
    310323/* Things to look up in the earthworm.h tables with getutil.c functions 
     
    355368} 
    356369 
    357 /*int read_dam_info( char *path ) { 
    358     FILE *fp = fopen( path, "r" ); 
    359     if ( fp == NULL ) 
    360         return -1; 
    361     char buffer[200]; 
    362     char *line = fgets(buffer, 180, fp); 
    363     line = fgets(buffer, 180, fp); 
    364     line = fgets(buffer, 180, fp); 
    365     line = fgets(buffer, 180, fp); 
    366     int lineno = 0; 
    367     while ( line != NULL && dam_count < MAX_DAMS ) { 
    368         char *word, *brkt; 
    369         word = strtok_r(line, ",", &brkt); 
    370         dam_tbl[dam_count].lon = atof( word ); 
    371         word = strtok_r(NULL, ",", &brkt); 
    372         dam_tbl[dam_count].lat = atof( word ); 
    373         word = strtok_r(NULL, ",", &brkt); 
    374         //strcpy( dam_tbl[dam_count].code, word ); 
    375         word = strtok_r(NULL, ",", &brkt); 
    376         strcpy( dam_tbl[dam_count].name, word ); 
    377         lineno++; 
    378         dam_count++; 
    379         line = fgets(buffer, 180, fp); 
    380     } 
    381     if ( line != NULL ) { 
    382         logit( "", "Maximum of %d facilites exceeded\n", MAX_DAMS ); 
    383     } 
    384     fclose( fp ); 
    385     return 0; 
    386 }*/ 
    387  
    388370char* my_strtok_r( char **brkt_ptr ) { 
    389371    if ( **brkt_ptr == ',' ) { 
     
    404386} 
    405387 
    406 /* 
    407 int read_alldam_info( char *path ) { 
    408     int i, j, max_region = 0, max_area = 0; 
    409     // Initialize region & area tables 
    410     for ( i=0; i<MAX_REGIONS; i++ ) { 
    411       region_order[i] = i; 
    412       strcpy( region_abbrs[i], "??" ); 
    413     } 
    414     for ( i=0; i<MAX_AREAS; i++ ) { 
    415       area_order[i] = i; 
    416       strcpy( area_abbrs[i], "??" ); 
    417     } 
    418     FILE *fp = fopen( path, "r" ); 
    419     if ( fp == NULL ) 
    420         return -1; 
    421     char buffer[300]; 
    422     char *line = fgets(buffer, 290, fp); 
    423     int lineno = 0; 
    424     while ( line != NULL && dam_count < MAX_DAMS ) { 
    425         char* brkt, c; 
    426         strtok_r(line, ",", &brkt);  // skip column A 
    427         dam_tbl[dam_count].lon = atof( my_strtok_r(&brkt) ); 
    428         dam_tbl[dam_count].lat = atof( my_strtok_r(&brkt) ); 
    429         my_strtok_r(&brkt); // skip column D 
    430         strcpy( dam_tbl[dam_count].name, my_strtok_r(&brkt) ); 
    431         // skip columns F & G 
    432         for ( c='f'; c<'h'; c++ ) 
    433           my_strtok_r( &brkt ); 
    434         strcpy( dam_tbl[dam_count].station, my_strtok_r(&brkt) ); 
    435         // skip columns I thru P 
    436         for ( c='i'; c<'q'; c++ ) 
    437           my_strtok_r( &brkt ); 
    438         dam_tbl[dam_count].region_id = i = atoi( my_strtok_r(&brkt) ); 
    439         dam_tbl[dam_count].area_id = j = atoi( my_strtok_r(&brkt) ); 
    440         // Add new area & region to tables 
    441         strcpy( region_abbrs[i], my_strtok_r(&brkt) ); 
    442         region_order[i] = i; 
    443         strcpy( area_abbrs[j], my_strtok_r(&brkt) ); 
    444         area_order[j] = j; 
    445         if ( i > max_region ) 
    446           max_region = i; 
    447         if ( j > max_area ) 
    448           max_area = j; 
    449  
    450     //         printf("%f %f %s %s '%s' %s\n", dam_tbl[dam_count].lat,  dam_tbl[dam_count].lon, 
    451     //              region_names[dam_tbl[dam_count].region_id], 
    452     //              area_names[dam_tbl[dam_count].area_id], 
    453     //               dam_tbl[dam_count].station,  dam_tbl[dam_count].name); 
    454             dam_count++; 
    455         lineno++; 
    456         line = fgets(buffer, 290, fp); 
    457     } 
    458     // Mark end of area & region tables; sort each's order table 
    459     max_region++; 
    460     region_order[max_region] = 99; 
    461     max_area++; 
    462     area_order[max_area] = 99; 
    463     qsort( region_order+1, max_region-1, sizeof(int), region_compare ); 
    464     qsort( area_order+1, max_area-1, sizeof(int), area_compare ); 
    465     if ( line != NULL ) { 
    466         logit( "", "Maximum of %d facilites exceeded\n", MAX_DAMS ); 
    467     } 
    468     fclose( fp ); 
    469     return 0; 
     388//reads stream conversion factor file 
     389//initializes ConversionFactor array 
     390//returns 0 if successful, -1 otherwise 
     391int conversion_read( char *path ) { 
     392        FILE *fp = NULL; 
     393        int lNum = 0; 
     394        size_t sLen = 0; 
     395        char factorStr[20]; 
     396        char lBuff[80]; 
     397        char *s1 = NULL; 
     398        char *s2 = NULL; 
     399 
     400        if (!(fp = fopen( path, "r" ))) { 
     401                logit("et", "Error opening stream conversion factor file %s\n", path);   
     402                return -1; 
     403        } 
     404 
     405        for ( lNum = 0; (lNum < MAX_STREAMS) && (s1 = fgets(lBuff, 80, fp)); lNum++) { 
     406                if(!(s2 = strpbrk(s1, " \t"))) { 
     407                        //if a line can't be parsed, skip it: 
     408                        logit("et", "Error parsing line %s\n", lBuff); 
     409                        continue;        
     410                } 
     411                sLen = s2 - s1; 
     412                strncpy(ConversionFactors[lNum].SNCL, s1, sLen);  
     413                sLen = strcspn(s2, " \t"); //find num of whitespace chars to skip 
     414                strncpy(factorStr, (char *)&(s2[sLen]), 20); 
     415 
     416                ConversionFactors[lNum].convFactor = atof(factorStr);    
     417        } 
     418 
     419        return 0; 
    470420} 
    471 */ 
    472421 
    473422int read_RAD_info( char *path ) { 
     
    504453    lineno++; 
    505454    line = fgets(buffer, 290, fp); 
    506 //     printf("Line(a) %d: %s", lineno, line); 
    507     while ( line != NULL ) { 
     455 
     456        while ( line != NULL ) { 
    508457        if ( strncmp( line, "#Area", 5 )==0 ) { 
    509458            stage += 1; 
     
    525474        lineno++; 
    526475        line = fgets(buffer, 290, fp); 
    527 //         printf("Line(b) %d: %s", lineno, line); 
    528476    } 
    529477    max_region++; 
    530478    region_order[max_region] = 99; 
    531479    qsort( region_order+1, max_region-1, sizeof(int), region_compare ); 
    532 //     printf("Line %d\n", lineno); 
    533     if ( Debug ) { 
     480 
     481        if ( Debug ) { 
    534482        logit("","Regions (%d):\n", max_region); 
    535483        for ( i=1; i<max_region; i++ ) 
     
    559507        lineno++; 
    560508        line = fgets(buffer, 290, fp); 
    561 //         printf("Line(c) %d: %s", lineno, line); 
    562509    } 
    563510    max_area++; 
    564511    area_order[max_area] = 99; 
    565512    qsort( area_order+1, max_area-1, sizeof(int), area_compare ); 
    566 //     printf("Line %d\n", lineno); 
    567513    if ( Debug ) { 
    568514        logit("","Areas (%d)!:\n", max_area); 
     
    601547    } 
    602548 
    603 //     printf("Line %d\n", lineno); 
    604549    if ( Debug ) { 
    605550        logit("","Dams (%d):\n", dam_count); 
     
    640585    return NULL; 
    641586} 
    642  
    643 // static void use_for_break() {} 
    644587 
    645588void updateSubscriptions() { 
     
    684627        line[strlen(line)-1] = 0; 
    685628        strcpy( emailrecipients[nemailrecipients-numSubs].address, line ); 
    686 //         printf( "Email: %s\n", emailrecipients[nemailrecipients-numSubs].address ); 
    687629        if ( fgets( line, 190, fp ) == NULL ) { 
    688630            nemailrecipients -= numSubs; 
     
    705647                for ( i=0; region_abbrs[i][0]!=0 && strcmp(code,region_abbrs[i]); i++ ); 
    706648                if ( region_abbrs[i][0] ) { 
    707 //                     printf("Region: %s (%d = %s)\n", code, i, region_abbrs[i] ); 
    708649                    emailrecipients[nemailrecipients-numSubs].subRegions |= (1<<i); 
    709650                } 
     
    716657        } 
    717658        emailrecipients[nemailrecipients-numSubs].numRegions = ncodes; 
    718 //         printf( "# Regions: %d\n", ncodes ); 
    719659        if ( fgets( line, 190, fp ) == NULL ) { 
    720660            nemailrecipients -= numSubs; 
     
    732672                for ( i=0; area_abbrs[i][0]!=0 && strcmp(code,area_abbrs[i]); i++ ); 
    733673                if ( area_abbrs[i][0] ) { 
    734 //                     printf("Area: %s (%d = %s)\n", code, i, area_abbrs[i] ); 
    735674                    emailrecipients[nemailrecipients-numSubs].subAreas |= (UINT64_C(1)<<i); 
    736675                } 
     
    743682        } 
    744683        emailrecipients[nemailrecipients-numSubs].numAreas = ncodes;         
    745 //         printf( "# Areas: %d\n", ncodes ); 
    746684        if ( fgets( line, 190, fp ) == NULL ) { 
    747685            nemailrecipients -= numSubs; 
     
    769707    }     
    770708    fclose( fp ); 
    771 // { 
    772 //     int i; 
    773 //     HypoArc     arc; 
    774 //     HypoArcSM2  arcsm; 
    775 //     char        regionsStr[MAX_STRING_SIZE]; 
    776 //     char        regionsUsed[MAX_REGIONS] = {0}; 
    777 //     uint32_t    subRegionsUsed = 0; 
    778 //     uint64_t    subAreasUsed = 0; 
    779 //     double distance_from_center, azm; 
    780 //      
    781 //     arc.sum.lat = 46.95; 
    782 //     arc.sum.lon = -119.24; 
    783 //     arc.sum.Mpref = 3.0; 
    784 //     arcsm.fromArc = 0; 
    785 //     prepare_dam_info( &arc, regionsStr, regionsUsed, &subRegionsUsed, &subAreasUsed ); 
    786 //     geo_to_km(center_lat, center_lon, arc.sum.lat, arc.sum.lon, &distance_from_center, &azm); 
    787 //     for( i=0; i<nemailrecipients; i++ )// One email for each recipient 
    788 //         printf( "%s: %s\n", emailrecipients[i].address, shouldSendEmail( i, distance_from_center, &arc, &arcsm, subRegionsUsed, subAreasUsed ) ? "Yes" : "No" ); 
    789 //     use_for_break(); 
    790 // } 
    791709} 
    792710 
     
    1060978                    char month_name[20]; 
    1061979                    char sncl[4][MAX_SCNL_STRING]; 
    1062                     int i, j, k; 
    1063  
     980                    int j, k; 
    1064981 
    1065982                    //parse_arc_no_shdw(msgbuf, &(arc->ha)); 
     
    11541071                                    strcmp( arc_list[i]->sm_arr[j].loc, sm.loc )) ) 
    11551072                                break; 
    1156                         arc_list[i]->sm_arr[j] = sm; 
    1157                         if ( j==n ) { 
    1158                             arc_list[i]->sm_count++; 
    1159                             if (Debug) 
    1160                                 logit("t","Added sm2 %s to %s (#%d) pga=%lf pgv=%lf pgd=%lf %d rsa\n", 
    1161                                       sncl, sm.qid, n+1, sm.pga, sm.pgv, sm.pgv, sm.nrsa); 
    1162                         } 
    1163                         else if ( Debug ) 
    1164                             logit("t","Replaced sm2 %s for %s (#%d) pga=%lf pgv=%lf pgd=%lf %d rsa\n", 
    1165                                   sncl, sm.qid, n+1, sm.pga, sm.pgv, sm.pgv, sm.nrsa); 
     1073                                                if((!RestrictThresholds) || (RestrictThresholds && (strcmp(RestrictedNetwork, sm.net) == 0))) { 
     1074                                arc_list[i]->sm_arr[j] = sm; 
     1075                                if ( j==n ) { 
     1076                                arc_list[i]->sm_count++; 
     1077                                if (Debug) 
     1078                                        logit("t","Added sm2 %s to %s (#%d) pga=%lf pgv=%lf pgd=%lf %d rsa\n", 
     1079                                        sncl, sm.qid, n+1, sm.pga, sm.pgv, sm.pgv, sm.nrsa); 
     1080                                } 
     1081                                else if ( Debug ) 
     1082                                logit("t","Replaced sm2 %s for %s (#%d) pga=%lf pgv=%lf pgd=%lf %d rsa\n", 
     1083                                        sncl, sm.qid, n+1, sm.pga, sm.pgv, sm.pgv, sm.nrsa); 
     1084                                                } 
    11661085                    } 
    1167                     //process_message( &sm ); 
    11681086                } else { 
    11691087                    logit( "", "sm2 %ld w/ no matching trigger:", n_qid ); 
     
    12041122#define ncommand 11        /* # of required commands you expect to process */ 
    12051123void config(char *configfile) { 
    1206     char init[ncommand]; /* init flags, one byte for each required command */ 
     1124        char init[ncommand]; /* init flags, one byte for each required command */ 
    12071125    int nmiss; /* number of required commands that were missed   */ 
    12081126    char *com; 
     
    12411159    /* Process all command files 
    12421160    ***************************/ 
    1243     while (nfiles > 0) /* While there are command files open */ 
     1161        while (nfiles > 0) /* While there are command files open */ 
    12441162    { 
    12451163        while (k_rd()) /* Read next line from active file  */ 
     
    14341352            else if ( k_its("NoWaveformPlots") ) 
    14351353            { 
    1436                 NoWaveformPlots = 1; 
     1354                                NoWaveformPlots = 1; 
    14371355            } 
    14381356            else if ( k_its("TimeMargin") ) 
     
    15431461                ShortHeader = 1; 
    15441462            } 
     1463                        else if ( k_its("EwaveAddr") ) 
     1464                        { 
     1465                                if ((str = k_str()) != NULL) { 
     1466                                        strncpy(ewaveAddr, str, 64); 
     1467                                        UseEWAVE = 1; 
     1468                                } 
     1469                        } 
     1470                        else if ( k_its("EwavePort") ) 
     1471                        { 
     1472                                if ((str = k_str()) != NULL) { 
     1473                                        strncpy(ewavePort, str, 16); 
     1474                                } 
     1475                        } 
     1476                        else if ( k_its("OnlyAllowThresholdsFromNetwork") ) 
     1477                        { 
     1478                                if ((str = k_str()) != NULL) { 
     1479                                        strncpy(RestrictedNetwork, str, 8); 
     1480                                        RestrictThresholds = 1; 
     1481                                } 
     1482                        } 
    15451483            else if ( k_its("UseGIF") ) 
    15461484            { 
     
    15641502            { 
    15651503                logit("e","gmewhtmlemail: dam_file has been deprecated; use RAD_file.\n" ); 
    1566                 /*            if ( dam_info_kind==2 ) { 
    1567                                 logit("e","gmewhtmlemail: full_dam_file and dam_file cannot both be specified; exiting.\n" ); 
    1568                                 exit(-1); 
    1569                             } 
    1570                             strcpy(path, k_str()); 
    1571                             dam_info_kind = 1; 
    1572                             read_dam_info ( path ); 
    1573                             init[8] = 1; 
    1574                 */ 
    15751504            } 
    15761505            /*8*/ else if ( k_its("full_dam_file") ) 
    15771506            { 
    15781507                logit("e","gmewhtmlemail: full_dam_file has been deprecated; use RAD_file.\n" ); 
    1579                 /*            if ( dam_info_kind==2 ) { 
    1580                                 logit("e","gmewhtmlemail: full_dam_file and dam_file cannot both be specified; exiting.\n" ); 
    1581                                 exit(-1); 
    1582                             } 
    1583                             strcpy(path, k_str()); 
    1584                             dam_info_kind = 2; 
    1585                             read_alldam_info ( path ); 
    1586                             init[8] = 1; 
    1587                 */ 
    15881508            } 
    15891509            /*8*/ else if ( k_its("RAD_file") ) 
     
    15981518                init[9] = 1; 
    15991519            } 
     1520                        else if ( k_its("conversions_file") ) 
     1521                        { 
     1522                                strcpy(path, k_str()); 
     1523                                if(conversion_read ( path ) == -1) { 
     1524                                        logit("et", "gmewhtmlemail: failed to process conversion factor file\n"); 
     1525                                } 
     1526                        } 
    16001527            else if ( k_its("MaxStationDist") ) 
    16011528            { 
     
    16831610            else if ( k_its("EarthquakeDisclaimer") ) 
    16841611            { 
    1685                 char path[200]; 
    16861612                strcpy(path, k_str()); 
    16871613                EarthquakeDisclaimer = read_disclaimer ( path ); 
     
    16891615            else if ( k_its("TriggerDisclaimer") ) 
    16901616            { 
    1691                 char path[200]; 
    16921617                strcpy(path, k_str()); 
    16931618                TriggerDisclaimer = read_disclaimer ( path ); 
     
    17351660                showMax = 0; 
    17361661            } 
    1737 #ifdef TestMode 
    1738             else if ( k_its("NumSeg") ) 
    1739             { 
    1740                 NumSeg = k_int(); 
    1741             } 
    1742             else if ( k_its("NumFakeSites") ) 
    1743             { 
    1744                 NumFakeSites = k_int(); 
    1745             } 
    1746 #endif 
    17471662            else if ( k_its("MaxFacilitiesOnMap") ) 
    17481663            { 
     
    17611676                MaxFacilitiesInTable = k_int(); 
    17621677            } 
    1763              
     1678            else if ( k_its("ColorPGA") ) 
     1679            { 
     1680                if (ncolorpga < MAX_COLOR_PGAS) 
     1681                { 
     1682                    colorpga_values[ncolorpga] = k_val(); 
     1683                    // if other color PGA values and this value is not less than previous value 
     1684                    if (ncolorpga > 0 && colorpga_values[ncolorpga] >= colorpga_values[ncolorpga - 1]) 
     1685                    { 
     1686                        logit("e", "gmewhtmlemail: Invalid ColorPGA value (%lf). Exiting.\n", 
     1687                              colorpga_values[ncolorpga]); 
     1688                        exit(-1); 
     1689                    } 
     1690                    strncpy(colorpga_colors[ncolorpga], k_str(), MAX_STRING_SIZE); 
     1691                    ncolorpga++; 
     1692                } 
     1693                else 
     1694                { 
     1695                    logit("e", "gmewhtmlemail: Excessive number of ColorPGA values. Exiting.\n"); 
     1696                    exit(-1); 
     1697                } 
     1698            } 
     1699 
    17641700             
    17651701 
     
    18141750        updateSubscriptions(); 
    18151751         
    1816 //    if (ShowRegionAndArea) { 
    1817 //         if ( dam_info_kind != 2 ) { 
    1818 //             logit( "", "gmewhtmlemail: Missing full_dam_file precludes ShowRegionAndArea\n" ); 
    1819 //             ShowRegionAndArea = 0; 
    1820 //         } else 
    1821 //            facility_font_size = 1; 
    1822 //    } 
    18231752    return; 
    18241753} 
     
    19341863        return 0; 
    19351864 
    1936     sprintf( cmdStr, "%s %s %lf %lf %s", PathToPython, PathToLocaltime, lon, lat, timestrUTC ); 
     1865    snprintf( cmdStr, 512, "%s %s %lf %lf %s", PathToPython, PathToLocaltime, lon, lat, timestrUTC ); 
    19371866    if ( Debug ) 
    19381867        logit( "", "Local time command: %s\n", cmdStr ); 
     
    19621891    FILE *fp; 
    19631892 
    1964     sprintf( cmdStr,  "java -cp %s/GmpeGmm.jar -DPGACALC_NO_RESULT=OOPS com.isti.gmpegmm.DeterministicSpectra \"Dam\" %lf %lf %lf %lf %lf %lf", 
     1893    snprintf( cmdStr, 512,  "java -cp %s/GmpeGmm.jar -DPGACALC_NO_RESULT=OOPS com.isti.gmpegmm.DeterministicSpectra \"Dam\" %lf %lf %lf %lf %lf %lf", 
    19651894             EstimatePGAsPath, lon, lat, evt_mag, evt_lon, evt_lat, evt_depth ); 
    19661895    if ( Debug ) 
     
    19871916} 
    19881917 
    1989  
     1918static char* determine_pga_color(double pga) 
     1919{ 
     1920    if (ncolorpga > 0) 
     1921    { 
     1922        int i; 
     1923        for ( i = 0; i < ncolorpga; i++) 
     1924        { 
     1925            if (pga >= colorpga_values[i]) 
     1926            { 
     1927                return colorpga_colors[i]; 
     1928            } 
     1929        } 
     1930    } 
     1931    return NULL; 
     1932} 
     1933 
     1934static void print_table_header_cell(FILE *htmlfile, char *text) 
     1935{ 
     1936    fprintf( htmlfile, "<th><font size=\"1\" face=\"Sans-serif\" color=\"FFFFFF\">%s</font></th>", text); 
     1937} 
     1938 
     1939static void print_table_cell(FILE *htmlfile, double value) 
     1940{ 
     1941    fprintf( htmlfile, "<td style=\"text-align:right\"><font size=\"1\" face=\"Sans-serif\">%1.6lf</font></td>", value); 
     1942} 
     1943 
     1944static void print_table_cell_color(FILE *htmlfile, double value, char *color) 
     1945{ 
     1946    if (color == NULL) 
     1947    { 
     1948        fprintf( htmlfile, "<td style=\"text-align:right\"><font size=\"1\" face=\"Sans-serif\">%1.6lf</font></td>", value); 
     1949    } 
     1950    else 
     1951    { 
     1952        fprintf( htmlfile, "<td style=\"text-align:right;background-color:%s\"><font size=\"1\" face=\"Sans-serif\">%1.6lf</font></td>", color, value); 
     1953    } 
     1954} 
     1955 
     1956/**************************************************************************** 
     1957 * InsertStationTable(): adds station table to HTML email 
     1958 *                      calculates snl_order, the order streams will be displayed in 
     1959 * 
     1960 * @params: 
     1961 * 
     1962 * in: htmlfile, fromArc, nsites, site_order[], sorted_sites[], smForSite[] 
     1963 * in/out: snl_sites, snl_order[] 
     1964 * 
     1965 * returns 0 if successful, -1 otherwise 
     1966 * */ 
     1967int InsertStationTable(FILE *htmlfile, char fromArc, int nsites, 
     1968                                                SiteOrder site_order[MAX_STATIONS], SITE *sorted_sites[MAX_STATIONS], 
     1969                                                SM_INFO *smForSite[MAX_STATIONS], int *snl_sites, 
     1970                                                SiteOrder snl_order[MAX_STATIONS], double distances[MAX_STATIONS]) 
     1971{ 
     1972        int i = 0, j = 0, ix = 0, jx = 0, snl_i = 0; //various counter variables 
     1973        int num_snl = 0;        //so we don't have to always deference snl_sites  
     1974        char *color; 
     1975        double pgapg; 
     1976 
     1977        //Calculate the appropriate stream order: 
     1978    *snl_sites = num_snl = 1; 
     1979    if ( (fromArc) && (nsites > 0) ) { 
     1980        logit("t", "Computing SNL order\n"); 
     1981        snl_order[0] = site_order[0]; 
     1982        for ( i=1; i<nsites; i++ ) { 
     1983                if ( PlotAllSCNLs ) 
     1984                snl_order[num_snl++] = site_order[i]; 
     1985            else { 
     1986                ix = site_order[i].idx; 
     1987                for ( j=0; j<num_snl; j++ ) { 
     1988                        jx = snl_order[j].idx; 
     1989                    if ( !strcmp( smForSite[ix]->sta, smForSite[jx]->sta) && 
     1990                                !strcmp( smForSite[ix]->net, smForSite[jx]->net) && 
     1991                                !strcmp( smForSite[ix]->loc, smForSite[jx]->loc) ) { 
     1992                        if ( smForSite[ix]->pga > smForSite[jx]->pga ) { 
     1993                                                        logit("t", "Moving %s.%s to head (%lf %lf)\n",  
     1994                                                                        smForSite[ix]->sta, smForSite[ix]->comp,  
     1995                                                                        smForSite[ix]->pga, smForSite[jx]->pga ); 
     1996                                snl_order[j].idx = ix; 
     1997                        } 
     1998                        break; 
     1999                    } 
     2000                } 
     2001                if ( j == num_snl ) { 
     2002                    snl_order[num_snl] = site_order[i]; 
     2003                    num_snl++; 
     2004                } 
     2005                } 
     2006        } 
     2007        } else { 
     2008        for ( i=0; i<nsites; i++ ) { 
     2009                snl_order[i] = site_order[i]; 
     2010                } 
     2011                num_snl = nsites; 
     2012    } 
     2013 
     2014    if ( nsites > 0 ) { 
     2015        fprintf( htmlfile, "<table id=\"StationTable\" border=\"0\" cellspacing=\"1\" cellpadding=\"3\" width=\"600px\">\n" ); 
     2016        fprintf( htmlfile, "<tr bgcolor=\"000060\">"); 
     2017 
     2018        fprintf( htmlfile, "<th>#</th>"); 
     2019        print_table_header_cell( htmlfile, "Station"); 
     2020        if ( fromArc ) { 
     2021                print_table_header_cell( htmlfile, "Distance (km)"); 
     2022            if ( ShowMiles ) 
     2023                print_table_header_cell( htmlfile, "Distance (mi)"); 
     2024        } 
     2025        print_table_header_cell( htmlfile, "AI"); 
     2026        print_table_header_cell( htmlfile, "PGA (%g)"); 
     2027        print_table_header_cell( htmlfile, "PGA (g)"); 
     2028        print_table_header_cell( htmlfile, "PGA (cm/s/s)"); 
     2029        print_table_header_cell( htmlfile, "PGV (cm/s)"); 
     2030        print_table_header_cell( htmlfile, "PGD (cm)"); 
     2031        print_table_header_cell( htmlfile, "RSA 0.3s (cm/s/s)"); 
     2032        print_table_header_cell( htmlfile, "RSA 1s (cm/s/s)"); 
     2033        print_table_header_cell( htmlfile, "RSA 3s (cm/s/s)"); 
     2034        fprintf( htmlfile, "</tr>\n" ); 
     2035 
     2036        snl_i = 0; 
     2037        for( i = 0; i < nsites; i++ ) 
     2038        { 
     2039                ix = site_order[i].idx; 
     2040            fprintf( htmlfile,"<tr bgcolor=\"#%s\">", i%2==0 ? "DDDDFF" : "FFFFFF"); 
     2041            if ( snl_order[snl_i].idx == ix ) { 
     2042                snl_i++; 
     2043                fprintf( htmlfile, "<th><font size=\"1\" face=\"Sans-serif\">%d</font></th>", snl_i ); 
     2044            } else { 
     2045                fprintf( htmlfile, "<th><font size=\"1\" face=\"Sans-serif\"></font></th>" ); 
     2046                        } 
     2047            fprintf( htmlfile, "<td><font size=\"1\" face=\"Sans-serif\">%s.%s.%s.%s</font></td>", 
     2048                     sorted_sites[i]->name, sorted_sites[i]->comp, 
     2049                     sorted_sites[i]->net, sorted_sites[i]->loc ); 
     2050            if ( fromArc ) { 
     2051                fprintf( htmlfile, "<td style=\"text-align:right\"><font size=\"1\" face=\"Sans-serif\">%1.1lf</font></td>", distances[ix]); 
     2052                if ( ShowMiles ) { 
     2053                        fprintf( htmlfile, "<td style=\"text-align:right\"><font size=\"1\" face=\"Sans-serif\">%1.1lf</font></td>", distances[ix]*KM2MILES); 
     2054                } 
     2055                        } 
     2056            print_table_cell( htmlfile, smForSite[ix]->ai); 
     2057            pgapg = 100*smForSite[ix]->pga/CM_S_S_1_g; 
     2058            color = determine_pga_color(pgapg); 
     2059            print_table_cell_color( htmlfile, pgapg, color); 
     2060            print_table_cell_color( htmlfile, smForSite[ix]->pga/CM_S_S_1_g, color); 
     2061            print_table_cell_color( htmlfile, smForSite[ix]->pga, color); 
     2062            print_table_cell( htmlfile, smForSite[ix]->pgv); 
     2063            print_table_cell( htmlfile, smForSite[ix]->pgd); 
     2064            for ( j=0; j<3; j++ ) { 
     2065                if ( j < smForSite[i]->nrsa) { 
     2066                        print_table_cell( htmlfile, smForSite[ix]->rsa[j]); 
     2067                                } else { 
     2068                    fprintf( htmlfile, "<td>&nbsp;</td>"); 
     2069                                } 
     2070                        } 
     2071            fprintf( htmlfile, "</tr>\n" ); 
     2072        } 
     2073        fprintf( htmlfile, "</table><br/><br/>\n" ); 
     2074    } else if ( fromArc ) { 
     2075        fprintf( htmlfile, "<p>No sites for table</p><br/><br/>"); 
     2076    } 
     2077 
     2078        *snl_sites = num_snl; 
     2079        return 0; 
     2080} 
     2081 
     2082/* 
     2083 * InsertDamTable(): inserts HTML table element displaying dam info 
     2084 *              calculates an estimate of PGA at facility 
     2085 * 
     2086 * @params: 
     2087 * in- htmlfile, HypoArc *,  
     2088 * 
     2089 * in/out: double *max_epga_g 
     2090 * 
     2091 * returns 0 if successful, -1 otherwise 
     2092 * */ 
     2093int InsertDamTable(FILE *htmlfile, HypoArc *arc, double *max_epga_g) 
     2094{ 
     2095        char temp[MAX_GET_CHAR] = {0}; 
     2096        double ePGA = 0.0; 
     2097        int damTblColumns = 3; 
     2098        int i = 0; 
     2099 
     2100        //Output dam table: 
     2101    fprintf( htmlfile, "<table id=\"DamTable\" border=\"0\" cellspacing=\"1\" cellpadding=\"3\" width=\"600px\">\n" ); 
     2102    fprintf( htmlfile, "<tr bgcolor=\"000060\">"); 
     2103    fprintf( htmlfile, "<th><font size=\"%d\" face=\"Sans-serif\" color=\"FFFFFF\">#</font></th>", facility_font_size); 
     2104    fprintf( htmlfile, "<th><font size=\"%d\" face=\"Sans-serif\" color=\"FFFFFF\">Facility</font></th>", facility_font_size); 
     2105    if ( ShowRegionAndArea ) { 
     2106        fprintf( htmlfile, "<th><font size=\"%d\" face=\"Sans-serif\" color=\"FFFFFF\">Region</font></th>", facility_font_size); 
     2107        fprintf( htmlfile, "<th><font size=\"%d\" face=\"Sans-serif\" color=\"FFFFFF\">Area</font></th>", facility_font_size); 
     2108    } 
     2109    fprintf( htmlfile, "<th><font size=\"%d\" face=\"Sans-serif\" color=\"FFFFFF\">Dist.(km)</font></th>", facility_font_size); 
     2110    if ( ShowMiles ) { 
     2111        fprintf( htmlfile, "<th><font size=\"%d\" face=\"Sans-serif\" color=\"FFFFFF\">Dist.(mi)</font></th>", facility_font_size); 
     2112        } 
     2113        if ( ReportEstimatedPGAs ) { 
     2114        fprintf( htmlfile, "<th><font size=\"%d\" face=\"Sans-serif\" color=\"FFFFFF\">PGA(est.)(%%g)</font></th>", facility_font_size); 
     2115        fprintf( htmlfile, "<th><font size=\"%d\" face=\"Sans-serif\" color=\"FFFFFF\">PGA(est.)(g)</font></th>", facility_font_size); 
     2116    } 
     2117    fprintf( htmlfile, "</tr>\n" ); 
     2118 
     2119    damTblColumns = 3; 
     2120    if ( ShowRegionAndArea )    damTblColumns += 2; 
     2121    if ( ShowMiles )            damTblColumns += 1; 
     2122    if ( ReportEstimatedPGAs )  damTblColumns += 2; 
     2123 
     2124    for ( i=0; i<dam_close_count; i++ ) { 
     2125        if ( MaxFacilitiesInTable >= 0 && i >= MaxFacilitiesInTable ) { 
     2126                fprintf( htmlfile,"<tr bgcolor=\"#FF6666\"><td colspan=\"%d\"><font size=\"%d\" face=\"Sans-serif\">%d more facilities (not listed)</font></td></tr>", damTblColumns, facility_font_size, dam_close_count-i ); 
     2127            break; 
     2128        } 
     2129        if ( i == damMapLimit ) { 
     2130                fprintf( htmlfile,"<tr bgcolor=\"#FF6666\"><td colspan=\"%d\"><font size=\"%d\" face=\"Sans-serif\">Facilities below this point will not appear on map</font></td></tr>", damTblColumns, facility_font_size ); 
     2131        } 
     2132        fprintf( htmlfile,"<tr bgcolor=\"#%s\">", i%2==0 ? "DDDDFF" : "FFFFFF"); 
     2133        if ( MapQuestKey[0] == 0 && i < 26 ) { 
     2134                fprintf( htmlfile, "<td><font size=\"%d\" face=\"Sans-serif\">%c</font></td>", facility_font_size, i+'A' ); 
     2135        } else { 
     2136                fprintf( htmlfile, "<td><font size=\"%d\" face=\"Sans-serif\">%d</font></td>", facility_font_size, i+1 ); 
     2137        } 
     2138                fprintf( htmlfile, "<td><font size=\"%d\" face=\"Sans-serif\">%s</font></td>", facility_font_size, dam_order[i]->name ); 
     2139        if ( ShowRegionAndArea ) { 
     2140            fprintf( htmlfile, "<td><font size=\"%d\" face=\"Sans-serif\">%s</font></td>", facility_font_size, region_names[dam_order[i]->region_id] ); 
     2141            fprintf( htmlfile, "<td><font size=\"%d\" face=\"Sans-serif\">%s</font></td>", facility_font_size, area_abbrs[dam_order[i]->area_id] ); 
     2142        } 
     2143        fprintf( htmlfile, "<td style=\"text-align:right\"><font size=\"%d\" face=\"Sans-serif\">%1.1lf</font></td>", facility_font_size, dam_order[i]->dist); 
     2144        if ( ShowMiles ) 
     2145                fprintf( htmlfile, "<td style=\"text-align:right\"><font size=\"%d\" face=\"Sans-serif\">%1.1lf</font></td>", facility_font_size, dam_order[i]->dist*KM2MILES); 
     2146        if ( ReportEstimatedPGAs ) { 
     2147            ePGA = EstimatePGA(  dam_order[i]->lat, dam_order[i]->lon, arc->sum.lat,  arc->sum.lon, arc->sum.z, arc->sum.Mpref ); 
     2148            if ( ePGA < 0 ) { 
     2149                strcpy( temp, "N/A" ); 
     2150                        } else { 
     2151                sprintf( temp, "%1.6lf", ePGA*100 ); 
     2152                        } 
     2153            if (ePGA > *max_epga_g) 
     2154                *max_epga_g = ePGA; 
     2155            fprintf( htmlfile, "<td style=\"text-align:right\"><font size=\"%d\" face=\"Sans-serif\">%s</font></td>", facility_font_size, temp); 
     2156            if ( ePGA >= 0 ) { 
     2157                sprintf( temp, "%1.6lf", ePGA ); 
     2158                        } 
     2159            fprintf( htmlfile, "<td style=\"text-align:right\"><font size=\"%d\" face=\"Sans-serif\">%s</font></td>", facility_font_size, temp); 
     2160        } 
     2161        fprintf( htmlfile, "</tr>\n" ); 
     2162    } 
     2163    fprintf( htmlfile, "</table><br/><br/>\n" ); 
     2164 
     2165        return 0; 
     2166} 
    19902167/* the magnitude type from hypoinverse: need to change if ML gets produced in future */ 
    19912168#define MAG_TYPE_STRING "Md" 
     
    20072184        //timeinfo = 
    20082185        localtime_ew ( &ot, &mytimeinfo ); 
    2009         //memcpy( &mytimeinfo, timeinfo, sizeof(mytimeinfo) ); 
    20102186        strftime( timestr, 80, "%Y.%m.%d %H:%M:%S (local to server)", &mytimeinfo ); // Prepare origin time (local) 
    20112187 
    20122188        //timeinfo = 
    20132189        gmtime_ew ( &ot, &mytimeinfo ); 
    2014         //memcpy( &mytimeinfo, timeinfo, sizeof(mytimeinfo) ); 
    20152190        strftime( timestrUTC, 80, "%Y.%m.%d %H:%M:%S", &mytimeinfo ); // Prepare origin time (UTC) 
    20162191    } 
     
    20772252        parity = 1-parity; 
    20782253 
    2079         /* 
    2080                 if (arc->sum.mdwt == 0 && DontShowMd==0) 
    2081                 { 
    2082         // Coda magnitude 
    2083             fprintf( htmlfile, "<tr bgcolor=\"DDDDFF\"><td><font size=\"3\" face=\"Sans-serif\">Coda Magnitude:</font></td>" 
    2084                 "<td><font size=\"3\" face=\"Sans-serif\">N/A %s nobs=None</font></td><tr>\n", 
    2085                 MAG_TYPE_STRING ); 
    2086                 } else if (DontShowMd == 0) 
    2087                 { 
    2088         // Coda magnitude