home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 3
/
FREEWARE.BIN
/
towns_os
/
whisper
/
source
/
msg.c
< prev
next >
Wrap
Text File
|
1980-01-02
|
24KB
|
1,222 lines
/****************************************
Shell like Message Wind
1990.9.25 make by ken
******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <time.h>
#include <mos.h>
#include "event.h"
#include "graphic.h"
#include "defs.h"
#include "coldef.h"
#define FUNC_MAX (32*1024)
#define HASH_MAX 16 /* 4,8,16,32... */
#define HASH(p) hash_calc(p)
#define MSG_MAX 128
#define BUF_MAX 256
#define MSG_LEN 50
#define MSG_X1 112
#define MSG_Y1 120
#define MSG_XSIZ (MSG_LEN*8+16)
#define MSG_YSIZ (11*18+16)
#define MSG_X2 (MSG_X1+MSG_XSIZ-1)
#define MSG_Y2 (MSG_Y1+MSG_YSIZ-1)
#define YES_X (MSG_X1+17*8)
#define YES_Y (MSG_Y1+10*18+12)
#define NO_X (MSG_X1+25*8)
#define NO_Y (MSG_Y1+10*18+12)
void CHK_snd(void);
void CHK_eup(void);
void DSP_xline();
int MSG_run();
int iskan(char *p);
int kan_pos(char *str,int pos);
void key_in(void);
void key_out(void);
int kbhit(void);
int getkey(unsigned *ec);
int getch(void);
int keyword(char *file,int sw);
void getdir(char *dir);
int MSG_cfg_load(char *file);
char *secret_file(char *file);
void EDIT_KEY_set(int code,char *func);
void TERM_KEY_set(int code,char *func);
void KAN_KAN_open(void);
void KAN_close(void);
void CON_open(int no);
void CON_close();
char *CON_input(int ch);
int CON_redisp(int ofs);
typedef struct _MAC {
struct _MAC *next;
char *mac;
char *str;
} MACRO;
static int msg_event=ERR;
static int msg_col=15,msg_bak=9,msg_lin=7,msg_lin2=8;
static int msg_len=0,msg_ox=0,msg_x=0,msg_y=0;
static int msg_sts=FALSE;
static int msg_open_flg=FALSE;
static BLOCK *msg_save=NULL;
int msg_tab=8;
static char msg_buf[BUF_MAX];
char func_buf[FUNC_MAX];
char *func_ptr=func_buf;
static MACRO *topmac[HASH_MAX]={
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL };
static MACRO *topprc[HASH_MAX]={
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,
NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL };
int hash_calc(register char *p)
{
register int hs=0;
while ( *p != '\0' )
hs = hs * 31 + *(p++);
return(hs & (HASH_MAX-1));
}
char *strdup(char *str)
{
register char *p;
if ( (p = (char *)malloc(strlen(str)+1)) != NULL )
strcpy(p,str);
return p;
}
int htoi(char *p)
{
int i=0;
while ( isxdigit(*p) ) {
if ( isdigit(*p) )
i = i * 16 + (*p - '0');
else
i = i * 16 + (toupper(*p) - 'A' + 10);
p++;
}
return i;
}
void tsleep(int sec)
{
clock_t t;
t = clock() + CLK_TCK * sec;
while ( t > clock() ) {
CHK_snd();
CHK_eup();
}
}
char *get_word(char *buf,char *str)
{
while ( *str != '\0' && (isalnum(*str) || *str == '_') )
*(buf++) = *(str++);
*buf = '\0';
return str;
}
char *prcget(char *prc)
{
register MACRO *mp;
for ( mp = topprc[HASH(prc)] ; mp != NULL ; mp = mp->next ) {
if ( strcmp(mp->mac,prc) == 0 )
return mp->str;
}
return "";
}
void prcset(char *prc,char *str)
{
int hs;
register MACRO *mp;
hs = HASH(prc);
for ( mp = topprc[hs] ; mp != NULL ; mp = mp->next ) {
if ( strcmp(mp->mac,prc) == 0 ) {
free(mp->str);
mp->str = strdup(str);
return;
}
}
if ( (mp = (MACRO *)malloc(sizeof(MACRO))) != NULL ) {
mp->next = topprc[hs];
topprc[hs] = mp;
mp->mac = strdup(prc);
mp->str = strdup(str);
}
}
char *macget(char *mac)
{
register MACRO *mp;
for ( mp = topmac[HASH(mac)] ; mp != NULL ; mp = mp->next ) {
if ( strcmp(mp->mac,mac) == 0 )
return mp->str;
}
return "";
}
void macset(char *mac,char *str)
{
int hs;
register MACRO *mp;
hs = HASH(mac);
for ( mp = topmac[hs] ; mp != NULL ; mp = mp->next ) {
if ( strcmp(mp->mac,mac) == 0 ) {
free(mp->str);
mp->str = strdup(str);
return;
}
}
if ( (mp = (MACRO *)malloc(sizeof(MACRO))) != NULL ) {
mp->next = topmac[hs];
topmac[hs] = mp;
mp->mac = strdup(mac);
mp->str = strdup(str);
}
}
void macvalset(char *mac,int val)
{
char tmp[16];
sprintf(tmp,"%d",val);
macset(mac,tmp);
}
int macval(char *mac)
{
return atoi(macget(mac));
}
char *cutpara(char *arg,char *str)
{
int n=0,len=0;
*arg = '\0';
if ( *str != '(' )
return str;
while ( len < (BUFSIZ - 2) && *(++str) != '\0' ) {
if ( iskan(str) ) {
*(arg++) = *(str++);
*(arg++) = *str;
len += 2;
} else if ( *str == '(' ) {
*(arg++) = *str;
n++;
len++;
} else if ( *str == ')' && --n < 0 ) {
str++;
break;
} else {
*(arg++) = *str;
len++;
}
}
*arg = '\0';
return str;
}
char *cutcmds(char *str)
{
int n;
if ( *(str++) != '{' )
return NULL;
for ( n = 0 ; *str != '\0' ; str++ ) {
if ( iskan(str) )
str++;
else if ( *str == '{' )
n++;
else if ( *str == '}' && --n < 0 )
return str;
}
return NULL;
}
char *get_str(char *buf,char *str)
{
int n,len=0;
char *p;
char dmy[BUFSIZ];
while ( len < (BUFSIZ - 2) && *str != '\0' ) {
if ( *str == '\\' ) {
str++;
switch(*(str++)) {
case 'n':
*(buf++) = 0x0D;
*(buf++) = 0x0A;
len += 2;
break;
case 'r':
*(buf++) = 0x0D;
len++;
break;
case 't':
*(buf++) = 0x09;
len++;
break;
case 'b':
*(buf++) = 0x08;
len++;
break;
case 'c':
*(buf++) = 0x0C;
len++;
break;
case 'x':
n = 0;
while ( *str != '\0' ) {
if ( isdigit(*str) )
n = n * 16 + (*str - '0');
else if ( *str >= 'A' && *str <= 'F' )
n = n * 16 + (*str - 'A') + 10;
else if ( *str >= 'a' && *str <= 'f' )
n = n * 16 + (*str - 'a') + 10;
else
break;
str++;
}
*(buf++) = n;
len++;
break;
case '(':
for ( p = dmy ; *str != '\0' ; ) {
if ( *str == ')' ) {
str++;
break;
}
*(p++) = *(str++);
}
*p = '\0';
p = macget(dmy);
while ( len < (BUFSIZ - 2) && *p != '\0' ) {
*(buf++) = *(p++);
len++;
}
break;
default:
if ( *(str-1) == '0' ) {
n = 0;
while ( *str >= '0' && *str <= '7' )
n = n * 8 + (*(str++) - '0');
*(buf++) = n;
} else if ( isdigit(*(str-1)) ) {
n = 0; str--;
while ( isdigit(*str) )
n = n * 10 + (*(str++) - '0');
*(buf++) = n;
} else
*(buf++) = *(str-1);
len++;
break;
}
} else if ( *str == '"' ) {
str++;
break;
} else if ( iskan(str) ) {
*(buf++) = *(str++);
*(buf++) = *(str++);
len += 2;
} else {
*(buf++) = *(str++);
len++;
}
}
*buf = '\0';
return str;
}
char *get_para(int *mode,int *no,char *tmp,char *str)
{
int n;
*tmp = '\0';
*mode = (-1);
if ( *str == '"' ) {
str = get_str(tmp,++str);
*mode = 0;
} else if ( *str == '0' ) {
n = 0;
if ( *(++str) == 'x' ) {
str++;
while ( *str != '\0' ) {
if ( isdigit(*str) )
n = n * 16 + (*str - '0');
else if ( *str >= 'A' && *str <= 'F' )
n = n * 16 + (*str - 'A') + 10;
else if ( *str >= 'a' && *str <= 'f' )
n = n * 16 + (*str - 'a') + 10;
else
break;
str++;
}
} else {
while ( *str >= '0' && *str <= '7' )
n = n * 8 + (*(str++) - '0');
}
*mode = 1;
} else if ( isdigit(*str) ) {
n = 0;
do {
n = n * 10 + (*(str++) - '0');
} while ( isdigit(*str) );
*mode = 1;
} else {
str = get_word(tmp,str);
*mode = 2;
}
*no = n;
return str;
}
char *get_string(char *tmp,char *str)
{
int n;
*tmp = '\0';
if ( *str == '"' ) {
str = get_str(tmp,++str);
} else if ( *str == '0' ) {
n = 0;
if ( *(++str) == 'x' ) {
str++;
while ( *str != '\0' ) {
if ( isdigit(*str) )
n = n * 16 + (*str - '0');
else if ( *str >= 'A' && *str <= 'F' )
n = n * 16 + (*str - 'A') + 10;
else if ( *str >= 'a' && *str <= 'f' )
n = n * 16 + (*str - 'a') + 10;
else
break;
str++;
}
} else {
while ( *str >= '0' && *str <= '7' )
n = n * 8 + (*(str++) - '0');
}
sprintf(tmp,"%d",n);
} else if ( isdigit(*str) ) {
n = 0;
do {
n = n * 10 + (*(str++) - '0');
} while ( isdigit(*str) );
sprintf(tmp,"%d",n);
} else {
str = get_word(tmp,str);
strcpy(tmp,macget(tmp));
}
return str;
}
int cmp_func(char *str)
{
int ch,cd;
int no1,no2;
int md1,md2;
char para1[BUFSIZ];
char para2[BUFSIZ];
md1 = md2 = (-1);
str = get_para(&md1,&no1,para1,str);
if ( (ch = *str) != '\0' )
str = get_para(&md2,&no2,para2,++str);
switch(md1) {
case (-1):
cd = ERR;
break;
case 0:
switch(md2) {
case (-1): cd = strlen(para1); break;
case 0: cd = strcmp(para1,para2); break;
case 1: cd = atoi(para1) - no2; break;
case 2: cd = strcmp(para1,macget(para2)); break;
}
break;
case 1:
switch(md2) {
case (-1): cd = no1; break;
case 0: cd = no1 - atoi(para2); break;
case 1: cd = no1 - no2; break;
case 2: cd = no1 - atoi(macget(para2)); break;
}
break;
case 2:
switch(md2) {
case (-1): cd = strlen(macget(para1)); break;
case 0: cd = strcmp(macget(para1),para2); break;
case 1: cd = atoi(macget(para1)) - no2; break;
case 2: cd = strcmp(macget(para1),macget(para2)); break;
}
break;
}
switch(ch) {
case '=': case '\0':
return (cd == 0);
case '!':
return (cd != 0);
case '<':
return (cd < 0);
case '>':
return (cd > 0);
}
return FALSE;
}
void MSG_event(EVENT *ep)
{
switch(ep->now) {
case EVT_CLIP_MOS:
EVT_clip_on(ep);
case EVT_ON_MOS:
DSP_mos(1);
break;
case EVT_SELECT_MOS:
msg_event = ep->no;
case EVT_DOLACK_MOS:
ep->now = EVT_NON;
case EVT_MOVE_MOS:
EVT_clip_off(ep);
case EVT_OFF_MOS:
DSP_mos(0);
break;
}
}
void MOS_push(int x1,int y1,int x2,int y2)
{
static int sw,x,y;
if ( x1 != ERR ) {
MOS_rdpos(&sw,&x,&y);
MOS_horizon(x1,x2-8);
MOS_vertical(y1,y2-8);
} else {
MOS_horizon(0,632);
MOS_vertical(0,470);
MOS_setpos(x,y);
}
}
int MSG_pause(int fg)
{
unsigned ec;
EVT_sw(YES_X,YES_Y," Y E S ",COL_CHR,msg_bak,500,MSG_event,TRUE);
if ( fg != FALSE )
EVT_sw(NO_X,NO_Y," N O ",COL_CHR,msg_bak,500,MSG_event,FALSE);
MOS_disp(TRUE);
if ( fg != FALSE ) {
MOS_push(YES_X,YES_Y,NO_X+48,YES_Y+8);
MOS_setpos(NO_X-8,YES_Y+2);
} else {
MOS_push(YES_X,YES_Y,YES_X+48,YES_Y+8);
MOS_setpos(YES_X+28,YES_Y+2);
}
key_in(); /* key buffer clear */
key_out();
for ( msg_event = ERR ; msg_event == ERR ; ) {
EVT_loop(500);
if ( kbhit() != FALSE ) {
getkey(&ec); ec &= 0xFF00;
if ( ec == 0x7300 )
msg_event = TRUE;
else if ( ec == 0x7200 )
msg_event = FALSE;
}
}
EVT_level_free(500);
MOS_disp(FALSE);
MOS_push(ERR,ERR,ERR,ERR);
DSP_xline(YES_X,YES_Y,NO_X+60,NO_Y+12,msg_bak,0);
return msg_event;
}
int MENU_tate(int x,int y,int col,char *argv[])
{
int i,n,max;
BLOCK *save;
for ( max = 0 ; argv[max] != NULL ; max++ );
i = x+strlen(argv[0])*8+8;
n = y+max*22;
MOS_disp(FALSE);
MOS_push(x,y,i,n);
MOS_setpos((x+i)/2,(y+n)/2);
save = DSP_push_vram(x,y,i,n);
DSP_box(x,y,i,n,COL_LINE,col);
for ( i = 0 ; i < max ; i++ )
EVT_big_sw(x+2,y+i*22+2,argv[i],COL_CHR,col,500,MSG_event,i);
MOS_disp(TRUE);
msg_event = ERR;
while ( msg_event == ERR )
EVT_loop(500);
EVT_level_free(500);
MOS_disp(FALSE);
MOS_push(ERR,ERR,ERR,ERR);
DSP_pop_vram(save);
return msg_event;
}
int MENU_state(int x,int y,int col,char *argv[])
{
int i,n,max;
BLOCK *save;
for ( max = 0 ; argv[max] != NULL ; max++ );
i = x+strlen(argv[0])*8+8;
n = y+max*14+1;
MOS_disp(FALSE);
MOS_push(x,y,i,n);
MOS_setpos((x+i)/2,(y+n)/2);
save = DSP_push_vram(x,y,i,n);
DSP_box(x,y,i,n,COL_LINE,col);
for ( i = 0 ; i < max ; i++ )
EVT_sw(x+2,y+i*14+2,argv[i],COL_CHR,col,500,MSG_event,i);
MOS_disp(TRUE);
msg_event = ERR;
while ( msg_event == ERR )
EVT_loop(500);
EVT_level_free(500);
MOS_disp(FALSE);
MOS_push(ERR,ERR,ERR,ERR);
DSP_pop_vram(save);
return msg_event;
}
int MENU_syoko(int x,int y,int col,char *argv[])
{
int i,n,max,len;
BLOCK *save;
for ( max = 0 ; argv[max] != NULL ; max++ );
len = strlen(argv[0]);
i = x+(len*8+6)*max+3;
n = y+15;
MOS_disp(FALSE);
MOS_push(x,y,i,n);
MOS_setpos((x+i)/2,(y+n)/2);
save = DSP_push_vram(x,y,x+(len*8+6)*max+3,y+15);
DSP_box(x,y,x+(len*8+6)*max+3,y+15,COL_LINE,col);
for ( i = 0 ; i < max ; i++ )
EVT_sw(x+(len*8+6)*i+2,y+2,argv[i],COL_CHR,col,500,MSG_event,i);
MOS_disp(TRUE);
msg_event = ERR;
while ( msg_event == ERR )
EVT_loop(500);
EVT_level_free(500);
MOS_disp(FALSE);
MOS_push(ERR,ERR,ERR,ERR);
DSP_pop_vram(save);
return msg_event;
}
char *MSG_getstr(int x,int y,int col,int bak,char *str,int max)
{
int i,n,ch,fg;
int ofs=0,len=0,pos=0;
BLOCK *save;
char *p;
char dmy[84];
static char tmp[84];
cur_x = x;
cur_y = y;
key_in();
fg = macval("NOECHO");
if ( str != NULL ) {
strcpy(tmp,str);
if ( (pos = len = strlen(str)) > 80 )
pos = len = 80;
}
for ( ch = 0 ; ; ) {
tmp[len] = '\0';
ofs = 0;
n = pos;
while ( n >= (max - 4) ) {
ofs += (max / 2);
ofs = kan_pos(tmp,ofs);
n = pos - ofs;
}
if ( (i = len - ofs) >= max )
i = kan_pos(tmp,ofs+max) - ofs;
if ( fg == FALSE )
strncpy(dmy,&(tmp[ofs]),i);
else
memset(dmy,'*',i);
dmy[i] = '\0';
save = DSP_push_vram(x,y,x+(i+3)*8,y+15);
wrtstr(dmy,page_ofs,x/2+y*512,
col_cnv[col],col_cnv[bak],16);
DSP_xline(x+n*8,y+14,x+n*8+7,y+15,15,4);
cur_x = x + n * 8;
while ( (ch = getch()) == 0xFFFF );
do {
if ( ch == 0x08 && pos > 0 ) {
pos = kan_pos(tmp,pos-1);
p = &(tmp[pos]);
n = (iskan(p) ? 2:1);
strcpy(p,p+n);
len -= n;
} else if ( ch == 0x7F ) {
if ( pos < len ) {
p = &(tmp[pos]);
n = (iskan(p) ? 2:1);
strcpy(p,p+n);
len -= n;
}
} else if ( ch == 0x1C ) {
if ( pos < len )
pos += (iskan(&(tmp[pos])) ? 2:1);
} else if ( ch == 0x1D ) {
if ( pos > 0 )
pos = kan_pos(tmp,pos-1);
} else if ( ch >= ' ' && len < 80 ) {
if ( pos < len ) {
p = &(tmp[len]);
for ( i = len - pos ; i > 0 ; i--,p-- )
*p = *(p-1);
}
tmp[pos++] = ch;
len++;
} else if ( ch == 0x0D ) {
msg_sts = FALSE;
goto ENDOF;
} else if ( ch == 0x1B ) {
msg_sts = ERR;
goto ENDOF;
}
} while ( (ch = getch()) != 0xFFFF );
DSP_pop_vram(save);
}
ENDOF:
DSP_pop_vram(save);
tmp[len] = '\0';
key_out();
return tmp;
}
int MSG_open_wind(void)
{
if ( msg_open_flg == FALSE ) {
msg_save = DSP_push_vram(MSG_X1,MSG_Y1,MSG_X2,MSG_Y2);
DSP_rbox(MSG_X1,MSG_Y1,MSG_X2,MSG_Y2,msg_lin,msg_lin2,msg_bak);
msg_open_flg = TRUE;
}
return TRUE;
}
int MSG_close_wind(void)
{
if ( msg_open_flg != FALSE )
DSP_pop_vram(msg_save);
msg_open_flg = FALSE;
msg_len = msg_ox = msg_x = msg_y = 0;
return FALSE;
}
void MSG_flush(void)
{
if ( msg_x == msg_ox )
return;
MSG_open_wind();
msg_buf[msg_x] = '\0';
wrtstr(&msg_buf[msg_ox],
page_ofs,(MSG_X1+msg_ox*8+8)/2+(MSG_Y1+msg_y*18+8)*512,
col_cnv[msg_col],col_cnv[msg_bak],16);
msg_ox = msg_x;
}
void MSG_putc(char ch)
{
msg_buf[msg_x++] = ch;
if ( msg_x >= MSG_LEN ) {
MSG_flush();
msg_ox = msg_x = 0;
msg_y++;
}
}
void MSG_puts(char *str)
{
int n;
while ( *str != '\0' ) {
switch(*str) {
case 0x0D:
MSG_flush();
msg_ox = msg_x = 0;
break;
case 0x0A:
MSG_flush();
msg_y++;
break;
case 0x08:
MSG_flush();
msg_ox = msg_x = msg_x - 1;
break;
case 0x09:
n = msg_tab - (msg_x % msg_tab);
while ( n-- > 0 )
MSG_putc(' ');
break;
case 0x0C:
if ( msg_open_flg != FALSE )
DSP_rbox(MSG_X1,MSG_Y1,MSG_X2,MSG_Y2,msg_lin,msg_lin2,msg_bak);
msg_ox = msg_x = msg_y = 0;
break;
default:
MSG_putc(*str);
break;
}
str++;
}
MSG_flush();
}
int MSG_echo(char *argv[])
{
while ( *argv != NULL )
MSG_puts(*(argv++));
return FALSE;
}
int MSG_input(char *argv[])
{
char *p;
while ( *argv != NULL ) {
p = MSG_getstr(MSG_X1+msg_ox*8+8,MSG_Y1+msg_y*18+8,
msg_col,msg_bak,macget(*argv),MSG_LEN-msg_ox);
macset(*(argv++),p);
}
return msg_sts;
}
int MSG_yes(char *argv[])
{
int cd;
cd = MSG_pause(FALSE);
while ( *argv != NULL )
macvalset(*(argv++),cd);
return cd;
}
int MSG_yesno(char *argv[])
{
int cd;
cd = MSG_pause(TRUE);
while ( *argv != NULL )
macvalset(*(argv++),cd);
return cd;
}
int MSG_color(char *argv[])
{
int n;
if ( (n = atoi(*argv)) != 0 )
msg_col = n;
return n;
}
int MSG_bakcol(char *argv[])
{
int n;
if ( (n = atoi(*argv)) != 0 )
msg_bak = n;
return n;
}
int MSG_lincol(char *argv[])
{
int n;
if ( (n = atoi(*argv)) != 0 ) {
msg_lin = n | 8;
msg_lin2 = n;
}
return n;
}
int TAB_set(char *argv[])
{
msg_tab = atoi(argv[0]);
return msg_tab;
}
int MSG_ext_cfg(char *argv[])
{
return MSG_cfg_load(*argv);
}
int MSG_menu_tate(char *argv[])
{
return MENU_tate(atoi(argv[0]),atoi(argv[1]),atoi(argv[2]),&(argv[3]));
}
int MSG_menu_state(char *argv[])
{
return MENU_state(atoi(argv[0]),atoi(argv[1]),atoi(argv[2]),&(argv[3]));
}
int MSG_menu_syoko(char *argv[])
{
return MENU_syoko(atoi(argv[0]),atoi(argv[1]),atoi(argv[2]),&(argv[3]));
}
int MSG_system(char *argv[])
{
int rc;
BLOCK *save;
save = DSP_push_vram(0,0,639,479);
KAN_close();
CON_open(999);
rc = system(*argv);
CON_close();
DSP_reinit();
DSP_pop_vram(save);
KAN_KAN_open();
return rc;
}
int equl(char *ptn,char *str)
{
while ( *ptn != '\0' ) {
if ( *ptn != toupper(*str) )
return FALSE;
ptn++;
str++;
}
return (*str == '\0' ? TRUE:FALSE);
}
int MSG_command(char *argv[])
{
int ch,ofs=0;
unsigned ec;
BLOCK *save;
char *p;
char tmp[BUFSIZ];
save = DSP_push_vram(0,0,639,479);
CON_open(atoi(argv[0]));
key_in();
getdir(tmp);
if ( (p = strrchr(tmp,'\\')) != NULL ) *p = '\0';
printf("%s> ",tmp);
for ( ; ; ) {
while ( kbhit() == 0 );
ch = getkey(&ec);
ec &= 0xFF14;
if ( ec == 0x6E00 ) {
ofs += 5;
ofs = CON_redisp(ofs);
} else if ( ec == 0x7000 ) {
if ( ofs > 0 ) {
ofs -= 5;
ofs = CON_redisp(ofs);
}
} else if ( ch != 0xFFFF ) {
if ( ofs > 0 ) {
ofs = 0;
CON_redisp(ofs);
}
if ( (p = CON_input(ch)) != NULL ) {
if ( *p == '\x1B' || equl("EXIT",p) ) {
printf("\n");
goto ENDOF;
} else if ( *p != '\0' ) {
system(p);
printf("\n");
}
getdir(tmp);
if ( (p = strrchr(tmp,'\\')) != NULL ) *p = '\0';
printf("%s> ",tmp);
}
}
}
ENDOF:
key_out();
CON_close();
DSP_pop_vram(save);
return FALSE;
}
int MSG_wind(char *str)
{
int cd;
str = prcget(str);
if ( str == NULL || *str == '\0' )
return ERR;
MOS_disp(FALSE);
mos_lock = TRUE;
msg_open_flg = FALSE;
msg_ox = msg_x = msg_y = 0;
msg_lin = 7;
msg_lin2 = 8;
msg_col = 15;
msg_event = ERR;
cd = MSG_run(str);
MSG_close_wind();
MOS_disp(TRUE);
mos_lock = FALSE;
return cd;
}
int MSG_cfg_load(char *file)
{
int n,nest=0;
int fun_flg = FALSE;
FILE *fp;
char *p,*s,*t;
char tmp[BUFSIZ];
char dmy[BUFSIZ];
if ( (fp = fopen(file,"r")) == NULL )
return ERR;
while ( (p = fgets(tmp,BUFSIZ,fp)) != NULL ) {
if ( (t = strrchr(p,'\n')) != NULL )
*t = '\0';
LOOP:
while ( isspace(*p) ) p++;
if ( *p == '#' || *p == '\0' )
continue;
if ( fun_flg == FALSE ) {
if ( *p == '.' ) { /* edit key defs */
n = htoi(p+1);
if ( (p = strchr(p,'=')) == NULL )
continue;
for ( p++ ; isspace(*p) ; p++ );
p = get_word(dmy,p);
EDIT_KEY_set(n,dmy);
continue;
} else if ( *p == '^' ) { /* term key defs */
n = htoi(p+1);
if ( (p = strchr(p,'=')) == NULL )
continue;
for ( p++ ; isspace(*p) ; p++ );
p = get_word(dmy,p);
TERM_KEY_set(n,dmy);
continue;
}
p = get_word(dmy,p);
if ( dmy[0] == '\0' )
continue;
while ( isspace(*p) ) p++;
if ( *p == '=' ) {
p++;
while ( isspace(*p) ) p++;
macset(dmy,p);
continue;
} else if ( *p == '{' ) {
p++;
while ( isspace(*p) ) p++;
s = func_ptr;
nest = 0;
fun_flg = TRUE;
} else
continue;
}
while ( *p != '\0' ) {
if ( *p == '#' )
break;
else if ( *p == '{' )
nest++;
else if ( *p == '}' && nest-- <= 0 ) {
*s = '\0';
prcset(dmy,func_ptr);
fun_flg = FALSE;
goto LOOP;
} else if ( *p == '"' ) {
do {
if ( iskan(p) ) {
if ( s < &func_buf[FUNC_MAX-2] )
*(s++) = *p;
p++;
}
if ( s < &func_buf[FUNC_MAX-2] )
*(s++) = *p;
p++;
} while ( *p != '\0' && *p != '"' );
} else if ( iskan(p) ) {
if ( s < &func_buf[FUNC_MAX-2] )
*(s++) = *p;
p++;
}
if ( s < &func_buf[FUNC_MAX-2] )
*(s++) = *p;
p++;
while ( isspace(*p) ) p++;
}
}
fclose(fp);
return FALSE;
}
int MSG_init(char *file,char *user)
{
time_t t;
struct tm *tp;
char *p;
char tmp[80];
time(&t);
tp = localtime(&t);
sprintf(msg_buf,"%02d/%02d/%02d",tp->tm_year,tp->tm_mon+1,tp->tm_mday);
macset("DATE",msg_buf);
sprintf(msg_buf,"%02d/%02d",tp->tm_mon+1,tp->tm_mday);
macset("TODAY",msg_buf);
sprintf(msg_buf,"%02d:%02d:%02d",tp->tm_hour,tp->tm_min,tp->tm_sec);
macset("TIME",msg_buf);
if ( file == NULL )
getdir(tmp);
else {
strcpy(tmp,file);
strcat(tmp,"\\");
}
macset("HOME",tmp);
sprintf(msg_buf,"%sWHISPER.CFG",tmp);
macset("SYSCFG",msg_buf);
sprintf(msg_buf,"%s%s.USR",tmp,(user == NULL ? "NONAME":user));
macset("USRCFG",msg_buf);
if ( MSG_cfg_load(macget("SYSCFG")) != FALSE )
return ERR;
macset("KEYWORD","WHISPER");
if ( (p = secret_file(macget("USRCFG"))) != NULL ) {
MSG_cfg_load(p);
remove(p);
}
macset("KEYWORD","");
return FALSE;
}
void MSG_end(void)
{
int i;
char *file;
FILE *fp;
MACRO *mp;
file = macget("USRCFG");
if ( (fp = fopen(file,"w")) == NULL )
return;
fprintf(fp,"NAME = %s\n",macget("NAME"));
fprintf(fp,"BASDAY = %s\n",macget("BASDAY"));
fprintf(fp,"LEVEL = %s\n",macget("LEVEL"));
fprintf(fp,"ACOUNT = %s\n",macget("ACOUNT"));
fprintf(fp,"FDATE = %s\n",macget("FDATE"));
fprintf(fp,"LDATE = %s\n",macget("DATE"));
fprintf(fp,"\n");
for ( i = 0 ; i < HASH_MAX ; i++ ) {
for ( mp = topmac[i] ; mp != NULL ; mp = mp->next ) {
if ( *(mp->mac) == '_' )
fprintf(fp,"%s = %s\n",mp->mac,mp->str);
}
}
fclose(fp);
macset("KEYWORD","WHISPER");
keyword(file,0);
}