home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.eri.u-tokyo.ac.jp
/
2014.03.ftp.eri.u-tokyo.ac.jp.zip
/
ftp.eri.u-tokyo.ac.jp
/
pub
/
seisv
/
src
/
3.02
/
seisv.c
< prev
next >
Wrap
C/C++ Source or Header
|
1999-11-10
|
22KB
|
718 lines
/********************************************************
* SeisView client/alone *
* *
* Copyright (C) 1992,1999 K.Koketsu *
* Earthquake Research Institute, University of Tokyo *
* *
* Update History *
* 1999.11.12 (3.02) K.Koketsu *
* 1999.01.08 (3.01) K.Koketsu *
* 1998.09.29 (3.00b) K.Koketsu *
* 1998.02.25 (3.00a) K.Koketsu *
* 1998.02.06 (3.00) K.Koketsu *
* 1996.10.08 (2.02a) K.Koketsu *
* 1996.06.19 (2.02) K.Koketsu *
* 1994.01.04 (2.01) K.Koketsu *
* 1993.06.02 (2.00) K.Koketsu *
* 1992.12.08 (1.03c) K.Koketsu *
* 1992.08.17 (1.03b) K.Koketsu *
* 1992.08.11 (1.03) K.Koketsu *
* 1992.06.23 (1.02) K.Koketsu *
* 1992.06.04 (1.01) K.Koketsu *
* 1992.05.19 (1.00) K.Koketsu *
/********************************************************/
char VERSION[] = "SeisView (Version 3.02 November 12, 1999)";
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include "ctlname.h"
#include "seis.h"
char *strupr();
int prompt();
void init(), dump_setup(), panel_input();
short nmax, nmax2; /* maximum numbers of selected events */
char fk[49*3+1]; /* display strings for function keys */
char help[64*11]; /* help messages for function selection*/
int itot; /* total # selected events */
short isort; /* flag for sorting */
char drv$[65], prn$[5], port$[65], drvo$[65]; /* parameters for disk,prn */
char z$[11], w$[81]; /* work string */
/***************************** variables for menu ****************************/
char em$[71]; /* error message on menu */
int mx[42], my[42], ml[42]; /* field variables */
char mc$[42][9], md$[65], me$[65], mf$[65]; /* field strings */
short isr = 0; /* initial cursor position */
short kd[13]; /* function key definitions*/
int err = 0; /* error code */
int mn, lm; /* mn:number of fields, lm:row position of message area */
extern char menuitem[10][10];
/**************************** variables for retrieval ************************/
extern char f2$[6];
extern char y1$[5], m1$[3], d1$[3], h1$[3], n1$[3], s1$[5];
extern char y2$[5], m2$[3], d2$[3], h2$[3], n2$[3], s2$[5];
extern char dst$[11];
extern char so1$[4], som1$[3], so2$[4], som2$[3];
extern char sa1$[3], sam1$[3], sa2$[3], sam2$[3];
extern char sew1$[2], sew2$[2], sns1$[2], sns2$[2];
extern char dp1$[6], dp2$[6], mg1$[5], mg2$[5];
extern char ynh$[2], ynm$[2];
/********************* parameters for map, graphics **************************/
extern char mps$[9], ync$[4];
extern int cdp[7], icd[7], ndp, nmg;
extern double cmg[8], ro, ru;
void main(argc, argv)
int argc;
char *argv[];
{
int fc;
init();
for(;;) {
fc = prompt(err);
err = 0;
switch( fc ) {
case CtlS: err = select_seis(); break;
case CtlB: err = browse() ; break;
case CtlP: err = print() ; break;
case CtlV: err = save() ; break;
case CtlR: err = sort() ; break;
case CtlM: err = map() ; break;
case CtlT: err = time_seisv() ; break;
case CtlG: err = magnitude() ; break;
case CtlO: err = option() ; break;
default : beep() ; break;
}
}
}
/*************************** INIT ***************** (Initialization process) */
void init()
{
short n;
if(getenv("SEIS") == NULL) *drvo$ = 0;
else strcpy(drvo$, getenv("SEIS"));
map_init(); /* Initialize some values for mapping. */
win_init();
menu_init();
n = alloc_mem(); /* Allocate work memories. */
nmax2 = n / 2 * 4095;
nmax = (n - n/2) * 4095;
itot = 0; isort = 0;
panel( INIT );
load_setup(); /* Load setup file. */
}
/************************* FINISH ***************** (Termination of process) */
void finish()
{
dump_setup();
win_finish();
exit( 0 );
}
/************* PANEL ************ (Draw a panel and construct an input menu) */
char *pan, init_pan[], option_pan[];
extern char select_pan[], save_pan[], map_pan[], map1_pan[], map2_pan[],
maps2_pan[], maps3_pan[], maps4_pan[], maps5_pan[], maps6_pan[],
sort_pan[], help_pan[], time_pan[], magnit_pan[];
int panel( func )
int func;
{
short i, j, k, c;
char pname[9], pxname[78], s[11], *mc;
switch( func ) {
case INIT : strcpy(pname, "INIT" ); break;
case SELECT : strcpy(pname, "SELECT" ); break;
case SAVE : strcpy(pname, "SAVE" ); break;
case SORT : strcpy(pname, "SORT" ); break;
case MAP : strcpy(pname, "MAP" ); break;
case TIME : strcpy(pname, "TIME" ); break;
case MAGNIT : strcpy(pname, "MAGNIT" ); break;
case OPTION : strcpy(pname, "OPTION" ); break;
case HELP : strcpy(pname, "HELP" ); break;
case MAP1 : strcpy(pname, "MAP1" ); break;
case MAP2 : strcpy(pname, "MAP2" ); break;
case MAPS2 : strcpy(pname, "MAPS2" ); break;
case MAPS3 : strcpy(pname, "MAPS3" ); break;
case MAPS4 : strcpy(pname, "MAPS4" ); break;
case MAPS5 : strcpy(pname, "MAPS5" ); break;
case MAPS6 : strcpy(pname, "MAPS6" ); break;
}
strcpy(pxname, drvo$); add_separator( pxname );
strcpy(s, pname); strcat(s, ".pan"); strlwr( s );
strcat(pxname, s);
windows_menu( func );
j100:
clear( 9 );
_normal_font();
if(nmax==0 || nmax2==0) {
wblink();
mvaddstr( 9, 20, "Available memory is less than 128KB!");
mvaddstr(10, 20, "Click 'Exit' to exit.");
return( -1 );
}
if(func == PRINT) {
mn = 0;
fkey( 0 ); /* Display function key definition.*/
wblink();
mvaddstr(5, 10, "Power on your printer and press Enter.");
standend();
}
else {
if(func!=INIT && func !=HELP) _wide_spacing();
standend();
switch( func ) {
case INIT : pan = init_pan ; mn = 0; lm = 15; break;
case SELECT: pan = select_pan; mn = 32; lm = 14; break;
case SAVE : pan = save_pan ; mn = 1; lm = 8; break;
case SORT : pan = sort_pan ; mn = 4; lm = 11; break;
case MAP : pan = map_pan ; mn = 16; lm = 11; break;
case TIME : pan = time_pan ; mn = 18; lm = 13; break;
case MAGNIT: pan = magnit_pan; mn = 6; lm = 11; break;
case OPTION: pan = option_pan; mn = 3; lm = 17; break;
case HELP : pan = help_pan ; mn = 0; lm = 21; break;
case MAP1 : pan = map1_pan ; mn = 24; lm = 23; break;
case MAP2 : pan = map2_pan ; mn = 15; lm = 14; break;
case MAPS2 : pan = maps2_pan ; mn = 31; lm = 12; break;
case MAPS3 : pan = maps3_pan ; mn = 22; lm = 13; break;
case MAPS4 : pan = maps4_pan ; mn = 33; lm = 14; break;
case MAPS5 : pan = maps5_pan ; mn = 5; lm = 12; break;
case MAPS6 : pan = maps6_pan ; mn = 2; lm = 6; break;
}
for(i=0; i<lm; i++) {
strncpy(w$, pan+i*77, 77);
w$[77] = 0;
if(func == INIT) {
if(i == 8) show_machine();
if(i == 9) strcpy(w$+22, VERSION+9);
}
mvaddstr(i, 0, w$);
}
if(func!=INIT && func!=HELP) mvaddstr(lm, 0, " --->");
if(mn == 0) {
fkey( -1 );
wrblink();
if(func == INIT)
mvaddstr(18, 22, "Press any key or button to begin.");
else
mvaddstr(22, 22, "Press any key or button to return.");
while(getcchr() == CtlE) check_exit();
}/* mn == 0 */
else {
for(j=0; j<mn; j++) {
sscanf(pan+i*77+j*11,"%d, %d, %d",&mx[j],&my[j],&ml[j]);
}
fkey( 0 ); /* Display function key definition.*/
standend();
/* Write menu headers. */
if(func!=MAPS6 && func!=OPTION) {
if(func == SELECT) {
move(0, 28); clrtoeol();
printw(" Memory available for %d/%d events.", nmax, nmax2);
}
else {
move(0, 32); clrtoeol();
printw("for %d events from %s.", itot, f2$);
}
}
/* Write error message if exits */
if(*em$ != 0) show_error_message( lm );
_small_font();
for(i=0; i<mn; i++) { /* Set defaults to fields */
if((k=ml[i]) > 100) k = k - 100;
if(k > 0) {
inputarea(mx[i], my[i], k);
wreverse();
if(k > 8) {
if(func == OPTION) {
switch( i ) {
case 0: mc = md$; break;
case 1: mc = me$; break;
case 2: mc = mf$; break;
}
}
else mc = md$;
}
else mc = mc$[i];
j = strlen( mc );
for(c=j; c<k; c++) mc[c] = ' ';
mc[k] = 0;
for(c=0; c<k; c++) set_writable(my[i],mx[i]+c);
mvaddstr(my[i], mx[i], mc);
}
else {
if(k < -8) mvaddstr(my[i], mx[i], md$);
else mvaddstr(my[i], mx[i], mc$[i]);
}
}
move(my[isr], mx[isr]); /* Set cursor at initial position. */
wreverse();
} /* mn != 0 */
} /* func != PRINT */
if(func==PRINT || mn>0) {
for(;;) {
c = getchr();
if(c == cr) break;
switch( c ) {
case F1 : if(tcopy() == 0) show_error_message(lm);
fkey(0); break;
case F3 : standend(); return(3);
case F6 : standend(); return(6);
case F9 : panel(HELP); goto j100;
case CtlE : check_exit(); break;
case ht : mvtonext(mn); break;
case bs : backspace() ; break;
case LEFT : move_left() ;
if(! iswritable()) mvtoprevious(mn); break;
case RIGHT: move_right();
if(! iswritable()) mvtonext(mn); break;
case DOWN : move_down(); break;
case UP : move_up() ; break;
case Home : mvhome() ; break;
case End : mvend() ; break;
default:
if(c >= 0x200) {
c = c - 0x200; move(c/80, c%80);
}
else if( isprint(c) ) {
if( iswritable() ) {
addch( c );
if( !iswritable() ) mvtonext( mn );
}
else beep();
}
else beep();
break;
}
}
for(i=0; i<mn; i++) { /* Get values from fields */
if((k=ml[i]) > 100) k = k - 100;
if(k > 8) {
if(func == OPTION) {
switch( i ) {
case 0: mc = md$; break;
case 1: mc = me$; break;
case 2: mc = mf$; break;
}
}
else mc = md$;
for(j=0; j<k; j++) mc[j] = mvinch(my[i], mx[i]+j);
mc[k] = 0;
if(ml[i] <= 100) strupr( mc );
}
else if(k > 0) {
for(j=0; j<k; j++) mc$[i][j] = mvinch(my[i], mx[i]+j);
mc$[i][k] = 0;
if(ml[i] <= 100) strupr( mc$[i] );
}
}
} /* func==PRINT || mn>0 */
standend();
return( 0 );
}
void show_error_message( row )
int row;
{
_normal_font();
wblink();
xouttext(row, 6, em$);
beep();
*em$ = 0;
standend();
}
void mvtonext()
{
int i;
j10:
for(i=0; i<mn; i++) {
if(mx[i]+my[i]*80>get_position() && ml[i]>0) break;
}
if(i == mn) { move(0,0); goto j10; }
move(my[i], mx[i]);
}
void mvtoprevious()
{
int i;
for(i=mn-1; i>=0; i--) {
if(mx[i]+my[i]*80+ml[i]-1<get_position() && ml[i]>0) break;
}
if(i == -1) i = mn - 1;
move(my[i], mx[i]+ml[i]-1);
}
void mvhome() { move(my[0], mx[0]); }
void mvend() { move(my[mn-1], mx[mn-1]); }
/********* PROMPT **********/
int prompt( err )
int err;
{
int i, fc;
clear( 9 );
_normal_font();
_normal_spacing();
wrblink();
mvaddstr(2, 5, "Click one of the commands on the menubar," );
mvaddstr(3, 5, "or Press Ctrl+(Capital Letter). " );
standend();
for(i=0; i<11; i++) {
mvaddstr(i+6, 5, help+i*64);
}
if( isort ) strcpy(w$, "special order");
else strcpy(w$, "chronological");
move(0, 5);
if(itot == 0) addstr( "No events selected.");
else printw("%d events [%s] selected from %s.", itot, w$, f2$);
move(1, 5);
printw("Memory available for %d/%d events.", nmax, nmax2);
mvaddstr(5, 5, "--->");
if( err ) {
wblink();
move(5, 10);
switch( err ) {
case 1: addstr("Invalid command or number!"); break;
case 2: printw("Number of events exceeds %d!",nmax); break;
case 3: addstr("No event has been selected!"); break;
case 4: printw("Events more than %d cannot be sorted!",nmax2);
break;
default: addstr("Error!");
}
beep();
}
windows_menu( PROMPT );
fkey( -1 );
while((fc = getcchr()) == CtlE) check_exit();
return( fc );
}
/********* FKEY ********** (Display function key definition.) */
void fkey( key )
short key;
{
char s[61];
if(key < 0) *s = 0;
else {
strncpy(s, fk+key*49, 49);
if(key == 2) strcpy(s+48, " ");
else { strcpy(s+48, " help "); strcat(s, "Enter "); }
}
windows_toolbar( s );
_normal_font();
}
/********* LOAD_SETUP ********** (Read the setup file.) */
#define SETUP "_seis"
void mksetup( s )
char *s;
{
if(getenv("HOME") == NULL) *s = 0;
else { strcpy(s, getenv("HOME")); add_separator( s ); }
strcat(s, SETUP);
}
void load_setup()
{
FILE *fp;
int i;
mksetup( w$ );
fp = fopen(w$, "r");
if( fp ) {
ffgets(w$, 81, fp);
if(strchr(w$,' ')) *(strchr(w$,' ')) = 0;
if(*w$ != 0) strcpy(drv$, w$);
ffgets(prn$, 81, fp); ffgets(port$, 81, fp);ffgets(f2$, 81, fp);
ffgets(y1$, 81, fp); ffgets(m1$, 81, fp); ffgets(d1$, 81, fp);
ffgets(h1$, 81, fp); ffgets(n1$, 81, fp); ffgets(s1$, 81, fp);
ffgets(y2$, 81, fp); ffgets(m2$, 81, fp); ffgets(d2$, 81, fp);
ffgets(h2$, 81, fp); ffgets(n2$, 81, fp); ffgets(s2$, 81, fp);
ffgets(dst$, 81, fp);
ffgets(so1$, 81, fp); ffgets(som1$, 81, fp); ffgets(sew1$, 81, fp);
ffgets(so2$, 81, fp); ffgets(som2$, 81, fp); ffgets(sew2$, 81, fp);
ffgets(sa1$, 81, fp); ffgets(sam1$, 81, fp); ffgets(sns1$, 81, fp);
ffgets(sa2$, 81, fp); ffgets(sam2$, 81, fp); ffgets(sns2$, 81, fp);
ffgets(dp1$, 81, fp); ffgets(dp2$, 81, fp);
ffgets(mg1$, 81, fp); ffgets(mg2$, 81, fp);
ffgets(ynh$, 81, fp); ffgets(ynm$, 81, fp);
ffgets(mps$, 81, fp);
if( ffgets(w$, 81, fp) ) {
sscanf(w$, "%d %d %lf %lf", &ndp, &nmg, &ro, &ru);
ffgets(w$, 81, fp);
for(i=0; i<ndp; i++) {
if(i == 0) cdp[i] = atoi(strtok(w$, " "));
else cdp[i] = atoi(strtok(NULL, " "));
}
ffgets(w$, 81, fp);
for(i=0; i<ndp; i++) {
if(i == 0) icd[i] = atoi(strtok(w$, " "));
else icd[i] = atoi(strtok(NULL, " "));
}
ffgets(w$, 81, fp);
for(i=0; i<nmg; i++) {
if(i == 0) cmg[i] = atof(strtok(w$, " "));
else cmg[i] = atof(strtok(NULL, " "));
}
ffgets(ync$, 81, fp);
ffgets(w$, 81, fp);
if(strchr(w$,' ')) *(strchr(w$,' ')) = 0;
if(*w$ != 0) strcpy(drvo$, w$);
}
else dpmg_init();
fclose( fp );
}
else {
get_printer_defaults(prn$, port$);
strcpy(f2$, "PDE ");
strcpy(y1$, "1979"); strcpy(m1$, "01"); strcpy(d1$, "01");
strcpy(h1$, "00"); strcpy(n1$, "00"); strcpy(s1$, "00.00");
strcpy(y2$, "1979"); strcpy(m2$, "12"); strcpy(d2$, "31");
strcpy(h2$, "23"); strcpy(n2$, "59"); strcpy(s2$, "59.99");
strcpy(dst$, "NWPAC");
strcpy(so1$, "120"); strcpy(som1$, "00"); strcpy(sew1$, "E");
strcpy(so2$, "180"); strcpy(som2$, "00"); strcpy(sew2$, "E");
strcpy(sa1$, "00" ); strcpy(sam1$, "00"); strcpy(sns1$, "N");
strcpy(sa2$, "60" ); strcpy(sam2$, "00"); strcpy(sns2$, "N");
strcpy(dp1$, "000.0"); strcpy(dp2$, "999.9");
strcpy(mg1$, "+0.0"); strcpy(mg2$, "+9.9");
strcpy(ynh$, "Y"); strcpy(ynm$, "Y");
*mps$ == 0;
dpmg_init();
strcpy(em$, w$);
strcat(em$, " is not found. Check the above options.");
option();
}
}
/********* DUMP_SETUP ********** (Write setup file.) */
void dump_setup()
{
FILE *fp;
int i;
mksetup( w$ );
fp = fopen(w$, "w");
if(*drv$ == 0) ffputs(" ", fp);
else ffputs(drv$, fp);
ffputs(prn$, fp); ffputs(port$, fp); ffputs(f2$, fp);
ffputs(y1$, fp); ffputs(m1$, fp); ffputs(d1$, fp);
ffputs(h1$, fp); ffputs(n1$, fp); ffputs(s1$, fp);
ffputs(y2$, fp); ffputs(m2$, fp); ffputs(d2$, fp);
ffputs(h2$, fp); ffputs(n2$, fp); ffputs(s2$, fp);
ffputs(dst$, fp);
ffputs(so1$, fp); ffputs(som1$, fp); ffputs(sew1$, fp);
ffputs(so2$, fp); ffputs(som2$, fp); ffputs(sew2$, fp);
ffputs(sa1$, fp); ffputs(sam1$, fp); ffputs(sns1$, fp);
ffputs(sa2$, fp); ffputs(sam2$, fp); ffputs(sns2$, fp);
ffputs(dp1$, fp); ffputs(dp2$, fp);
ffputs(mg1$, fp); ffputs(mg2$, fp);
ffputs(ynh$, fp); ffputs(ynm$, fp);
ffputs(mps$, fp);
sprintf(w$, "%d %d %f %f", ndp, nmg, ro, ru);
ffputs(w$, fp);
*w$ = 0;
for(i=0; i<ndp; i++) {
sprintf(z$, "%d ", cdp[i]);
strcat(w$, z$);
}
ffputs(w$, fp);
*w$ = 0;
for(i=0; i<ndp; i++) {
sprintf(z$, "%d ", icd[i]);
strcat(w$, z$);
}
ffputs(w$, fp);
*w$ = 0;
for(i=0; i<nmg; i++) {
sprintf(z$, "%f ", cmg[i]);
strcat(w$, z$);
}
ffputs(w$, fp);
ffputs(ync$, fp);
if(*drvo$ == 0) ffputs(" ", fp);
else ffputs(drvo$, fp);
fclose( fp );
}
ffgets(s, n, fp) /* n <= 81 */
unsigned char *s;
unsigned n;
FILE *fp;
{
char t[82];
fgets(t, n+1, fp);
if(feof(fp) || *t==0) { *s = 0; return( 0 ); }
/* strncpy() never put NULL at the end of string!
if(t[strlen(t)-1] == lf) strncpy(s, t, strlen(t)-1);
else strcpy(s, t); */
if(t[strlen(t)-1] == lf) t[strlen(t)-1] = 0;
strcpy(s, t);
return( 1 );
}
ffputs(s, fp)
unsigned char *s;
FILE *fp;
{
int err;
err = fputs(s, fp);
fputs("\n", fp);
return( err );
}
char *ggcvt(f, len, s)
double f;
short len;
char *s;
{
char t[4];
int i;
sprintf(t, "%%%1ug", len);
sprintf(s, t, f);
for(i=0; s[i]==' '; i++);
if(i > 0) strcpy(s, s+i);
return( s );
}
char *hcvt(f, s)
double f;
char *s;
{
ggcvt(f, 6, s);
if(s[strlen(s)-1] == '.') strcat(s, "0");
return( s );
}
/*************************** OPTION *******************/
int option()
{
isr = 0;
strcpy(md$, drv$);
strcpy(me$, drvo$);
strcpy(mf$, port$);
if(panel(OPTION) == 3) return( 0 );
strxcpy(drv$ , md$);
strxcpy(drvo$, me$);
strxcpy(port$, mf$);
return( 0 );
}
void add_separator( s )
char *s;
{
short i;
if(*s != 0) {
i = strlen( s ) - 1;
if(s[i]!='/' && s[i]!='\\' && s[i]!=':') strcat(s, "/");
}
}
void strxcpy(s, t)
char *s, *t;
{
int i;
strcpy(s, t);
/* Remove trailing blanks, but keep blanks within a string. */
for(i=strlen(s)-1; i>=0; i--) {
if( isgraph(s[i]) ) break;
}
s[i+1] = 0;
}
/************************ Panel Definitions **********************/
char fk[] = "\
hcopy quit return \0\
hcopy quit return functn\0\
hcopy quit top bottomreturn back forwrd";
char help[] = "\
SELECT......Select events. \0\
BROWSE......Browse data of the selected events. \0\
PRINT.......Print data of the selected events. \0\
SAVE........Save data of the selected events. \0\
SORT........Sort the selected events. \0\
MAP.........Plot the selected events on a map. \0\
TIME........Draw a time-frequency diagram for the events. \0\
MAGNITUDE...Draw a magnitude-frequency diagram for the events. \0\
OPTION......Specify options for directories and a printer. \0\
END.........Exit. ";
char init_pan[] ="\
\
\
\
\
\
\
\
SeisView \
\
\
\
by \
\
K.Koketsu & T.Yoshii \
Earthquake Research Institute, University of Tokyo ";
char option_pan[] = "\
Request : OPTION \
Specify options in () as you like and press Enter. \
\
Pathname of the directory for data files \
( ) \
Pathname of the directory for auxiliary files \
( ) \
Examples: /home/kk/seis, c:\\data\\seis (Windows), @hostname (server) \
If you keep this blank, the value of the SEIS environment variable \
will be taken. If both this and the variable are blank, a current \
working directory will be assumed. \
\
Printer Name \
( ) \
A printcap entry on UNIX, or a name in My Computer/Printers of \
Windows. \
\
6, 4,164 \
6, 6,164 \
6, 13,164 ";