/* we_term.c */
/* Copyright (C) 1993 Fred Kruse */
/* This is free software; you can redistribute it and/or */
/* modify it under the terms of the */
/* GNU General Public License, see the file COPYING. */
#include "messages.h"
#include "edit.h"
#ifdef DJGPP
#include<pc.h>
#include<bios.h>
#include<dos.h>
#include<dpmi.h>
#include<mouse.h>
#include<graphics.h>
#include <unistd.h>
#include<signal.h>
#include<fcntl.h>
#include<process.h>
#include "makro.h"
int MAXSLNS = 25;
int MAXSCOL = 80;
u_short e_h_di = 0, e_h_ax = 0;
#ifdef PROG
extern int wfildes[2], efildes[2];
extern char *e_p_msg[];
#endif
int cur_x = -1, cur_y = -1, cur_a = 0, cur_e = 0, c_flag = 0;
int e_t_initscr()
{ int i, ret;
union REGS cpu;
/*
cpu.h.ah = 3;
cpu.h.bh = 0;
int86(0x10, &cpu, &cpu);
*/
cpu.h.ah = 15;
int86(0x10, &cpu, &cpu);
if(cpu.h.al == 2 || cpu.h.al == 7)
{ cur_a = 11;
cur_e = 12;
}
else
{ cur_a = 6;
cur_e = 7;
}
e_begscr();
schirm = (char *) ScreenPrimary;
e_abs_refr();
return(0);
}
int svflgs, kbdflgs;
int e_begscr()
{
int cols, lns;
if((lns = ScreenRows()) > 0) MAXSLNS = lns;
if((cols = ScreenCols()) > 0) MAXSCOL = cols;
signal(SIGSEGV, e_exit);
return(0);
}
int e_endwin()
{
return(0);
}
/* Cursor Ein- und Ausschalten */
int fk_t_cursor(int sw)
{
union REGS cpu;
cpu.h.ah = 1;
if(sw == 0)
{ cpu.h.ch = 1;
cpu.h.cl = 0;
}
else if(sw == 2)
{ cpu.h.ch = 1;
cpu.h.cl = cur_e;
}
else
{ cpu.h.ch = cur_a;
cpu.h.cl = cur_e;
}
int86(0x10, &cpu, &cpu);
return(0);
}
char *tmpschirm, *svschirm;
void ini_repaint(ECNT *cn)
{
svschirm = schirm;
if((tmpschirm = (char *)MALLOC(4000*sizeof(char))) == NULL)
e_error(e_msg[ERR_LOWMEM], 1, cn->fb);
else
{
schirm = tmpschirm;
e_cls(cn->fb->df.fb, cn->fb->dc);
e_ini_desk(cn);
}
}
void end_repaint()
{
int n;
if(tmpschirm != NULL)
{ schirm = svschirm;
for(n = 0; n < 160*MAXSLNS; n++)
*(schirm + n) = *(tmpschirm + n);
FREE((char *)tmpschirm);
}
}
void ini_repaint_1(FENSTER *f)
{
svschirm = schirm;
if((tmpschirm = (char *)MALLOC(4000*sizeof(char))) == NULL)
e_error(e_msg[ERR_LOWMEM], 1, f->fb);
else schirm = tmpschirm;
}
void end_repaint_1(FENSTER *f)
{
int i, j;
if(tmpschirm != NULL)
{ schirm = svschirm;
for(j = f->a.y+1; j < f->e.y; j++)
for(i = f->a.x+1; i < f->e.x; i++)
{ *(schirm+2*MAXSCOL*j+2*i) = *(tmpschirm+2*MAXSCOL*j+2*i);
*(schirm+2*MAXSCOL*j+2*i+1) = *(tmpschirm+2*MAXSCOL*j+2*i+1);
}
FREE((char *)tmpschirm);
}
}
int x_bioskey()
{
union REGS cpu;
cpu.h.ah = 2;
int86(0x16,&cpu,&cpu);
return(cpu.h.al);
}
int e_kbhit()
{
if(kbhit()) return(getch());
return(e_mshit());
}
int e_t_getch(void)
{
#if MOUSE
extern struct mouse e_mouse;
int g[4] = { 1, 0, 0, 0, };
#endif
int c = 0, b = 0;
#if MOUSE
e_refresh();
fk_mouse(g);
while (c == 0)
{ if (kbhit() == 0)
{ g[0] = 3;
fk_mouse(g);
if(g[1] != 0)
{ if(g[1] == 2) c = -4;
else if(g[1] == 3) c = -2;
else c = - g[1];
e_mouse.x = g[2]/8;
e_mouse.y = g[3]/8;
}
}
else
{
#endif
if( (c = getxkey()) > 512 ) c -= 256;
if( c > 255 )
{ c--;
if(((b = bioskey()) & 3) != 0) c = 512 + c ;
else if(c == CF9 - 1) c++;
else if(c == 401 || c == 402) c+= 450;
else if((c == 337 || c == 338) && (b & 4)) c+= 514;
}
else if( c == 255 ) c = 0;
else if( c == ' ' && (bioskey() & 8)) c = AltBl;
#if MOUSE
}
}
g[0] = 2;
fk_mouse(g);
#endif
return(c);
}
int fk_t_locate(int x, int y)
{
cur_x = x;
cur_y = y;
ScreenSetCursor(y, x);
return(0);
}
int fk_t_putchar(char c)
{
return(fputc(c, stdout));
}
#if MOUSE
int fk_t_mouse(int g[])
{
extern int fk__mouse_stat;
union REGS cpu;
if (fk__mouse_stat==0) return(0);
if (fk__mouse_stat==1)
{ cpu.x.ax=0;
int86(0x33,&cpu,&cpu);
if (cpu.x.ax==0)
{ fk__mouse_stat=0;
return(-1); }
fk__mouse_stat=2;
}
cpu.x.ax=g[0];
cpu.x.bx=g[1];
cpu.x.cx=g[2];
cpu.x.dx=g[3];
int86(0x33,&cpu,&cpu);
g[0]=cpu.x.ax;
g[1]=cpu.x.bx;
g[2]=cpu.x.cx;
g[3]=cpu.x.dx;
return(1);
}
#else
int fk_t_mouse(int g[])
{
return(0);
}
#endif
int setdisk(int x)
{
union REGS cpu;
cpu.h.ah = 0x0e;
cpu.h.dl = x;
intdos(&cpu, &cpu);
return(cpu.x.cflag);
}
int getdisk()
{
union REGS cpu;
cpu.h.ah = 0x19;
intdos(&cpu, &cpu);
return(cpu.h.al);
}
int getcurdir(int n, char *str)
{
union REGS cpu;
cpu.h.ah = 0x47;
cpu.h.dl = n;
cpu.x.si = (unsigned long) str;
intdos(&cpu, &cpu);
return(-cpu.x.cflag);
}
int fk_setdisk(int n)
{
extern struct EXT h_error;
char s[256];
union REGS cpu;
h_error.sw = 0;
cpu.h.ah = 0x44;
cpu.h.al = 0x0f;
cpu.h.bl = n+1;
intdos(&cpu, &cpu);
/* if(n < 2) e_dsk_test(n + 1); */
if(h_error.sw) return(e_h_error());
if(getcurdir(n+1, s) != 0)
{ if(h_error.sw) return(e_h_error());
return(-1);
}
if(h_error.sw) return(e_h_error());
setdisk(n);
return(0);
}
#undef getcwd();
#undef chdir();
#ifdef DJ_OLD
char *e_getcwd(char *buf, int n)
{
char *p = buf+2;
union REGS cpu;
cpu.h.ah = 0x19;
intdos(&cpu, &cpu);
buf[0] = cpu.h.al + 'A';
buf[1] = ':';
if(!getcwd(p, n-2)) return(NULL);
for(; *p; p++) if(*p == '/') *p = '\\';
return(buf);
}
#else
char *e_getcwd(char *buf, int n)
{
char *p = buf;
if(!getcwd(p, n)) return(NULL);
for(; *p; p++) if(*p == '/') *p = '\\';
return(buf);
}
#endif
int e_chdir(char *buf)
{
char *p = buf;
if(buf[1] == ':')
{ union REGS cpu;
cpu.h.ah = 0x0e;
cpu.h.dl = toupper(buf[0]) - 'A';
intdos(&cpu, &cpu);
p += 2;
}
return(chdir(p));
}
int fk_lfw_test( int disk)
{
int ret, save;
union REGS cpu;
cpu.h.ah = 0x19;
intdos(&cpu, &cpu);
save = cpu.h.al;
cpu.h.ah = 0x44;
cpu.h.al = 0x0e;
cpu.h.bl = 1+disk;
intdos(&cpu, &cpu);
if(!cpu.x.cflag || cpu.x.ax == 1) return(cpu.h.al);
cpu.h.ah = 0x0e;
cpu.h.dl = disk;
intdos(&cpu, &cpu);
cpu.h.ah = 0x19;
intdos(&cpu, &cpu);
if(cpu.h.al == disk) ret = disk;
else ret = -1;
cpu.h.ah = 0x0e;
cpu.h.dl = save;
intdos(&cpu, &cpu);
return(ret);
}
#ifdef PROG
#ifdef GCC_MAIN
#include <setjmp.h>
jmp_buf e_j_buf;
#endif
int e_p_stdout = -1, e_p_stderr = -1, e_p_out_file, e_p_err_file;
int e_exec_inf(FENSTER *f, char **argv, int n)
{
char *sp, *s_tmp = NULL, w_tmp[128], e_tmp[128];
int i;
#ifdef DEBUGGER
if(e_d_swtch > 0) e_d_quit(f);
#endif
sprintf(w_tmp, "%s/we_%d.111", getenv("GO32TMP"), getpid());
if(e_p_stdout < 0) e_p_stdout = dup(1);
remove(w_tmp);
e_p_out_file = open(w_tmp, O_CREAT);
if(e_p_out_file < 0) return(0);
dup2(e_p_out_file, 1);
sprintf(e_tmp, "%s/we_%d.112", getenv("GO32TMP"), getpid());
if(e_p_stderr < 0) e_p_stderr = dup(2);
remove(e_tmp);
e_p_err_file = open(e_tmp, O_CREAT);
if(e_p_err_file < 0) return(0);
dup2(e_p_err_file, 2);
#ifdef GCC_MAIN
i = setjmp(e_j_buf);
if(!i) gcc_main(n, argv);
#else
for(i = 0; i < n && argv[i] != NULL; i++)
{ write(e_p_err_file, argv[i], strlen(argv[i]));
write(e_p_err_file, " ", 1);
}
write(e_p_err_file, "\n", 1);
s_tmp = MALLOC((strlen(argv[0])+1)*sizeof(char));
strcpy(s_tmp, argv[0]);
sp = argv[0];
argv[0] = s_tmp;
if(spawnvp(P_WAIT, s_tmp, argv)) e_print_arg(stderr, e_p_msg[ERR_IN_COMMAND], argv, n);
FREE(s_tmp);
argv[0] = sp;
/*
if(system(s_tmp)) e_print_arg(stderr, e_p_msg[ERR_IN_COMMAND], argv, n);
if(s_tmp) free(s_tmp);
*/
#endif
dup2(e_p_stdout, 1);
dup2(e_p_stderr, 2);
close(e_p_out_file);
close(e_p_err_file);
if((wfildes[0] = open(w_tmp, O_RDONLY)) < 0 )
{ e_error(e_p_msg[ERR_PIPEOPEN], 0, f->fb); return(1); }
if((efildes[0] = open(e_tmp, O_RDONLY)) < 0 )
{ e_error(e_p_msg[ERR_PIPEOPEN], 0, f->fb); return(1); }
return(1);
}
#endif
/* catch/handle hardware exceptions */
static char *err_msg[] = {
"Disk is Write-Protected",
"Unknown Unit",
"Drive not ready",
"Unknown Command",
"Data-Error (CRC)",
"rong Length (Request-Struktur)",
"Search-Error",
"Unknown Medium-Typ",
"Sektor not found",
"Printer got no Paper",
"Write-Error",
"Read-Error",
"General Error",
"Unknown Error",
"Unknown Error",
"Invallid Disk-Change"
};
int e_h_error()
{
static char msg[200];
extern struct EXT h_error;
int drive;
int errorno;
drive = e_h_ax & 0x00FF;
errorno = e_h_di & 0x00FF;
sprintf(msg, "Error at Drive %c: %s", 'A'+drive, err_msg[errorno]);
e_error(msg, 0, h_error.cn->fb);
return(-1);
}
_go32_dpmi_registers regs;
_go32_dpmi_seginfo info_24, old_vec_24, info_23, old_vec_23;
int e_d_handler(_go32_dpmi_registers *r)
{
extern struct EXT h_error;
e_h_ax = r->x.ax;
e_h_di = r->x.di;
h_error.sw = 1;
regs.x.flags = r->x.flags= 0xffff;
regs.h.dl = r->h.dl = 0x3;
return 1;
}
int harderr(int (*hnd)(_go32_dpmi_registers *r))
{
_go32_dpmi_get_real_mode_interrupt_vector(0x24, &old_vec_24);
info_24.pm_offset = (u_long) hnd;
_go32_dpmi_allocate_real_mode_callback_iret(&info_24, ®s);
_go32_dpmi_set_real_mode_interrupt_vector(0x24, &info_24);
return(0);
}
int reset_harderr(void)
{
_go32_dpmi_set_real_mode_interrupt_vector(0x24, &old_vec_24);
_go32_dpmi_free_real_mode_callback(&info_24);
return(0);
}
int e_t_sys_ini()
{
/* _go32_want_ctrl_break(0); */
reset_harderr();
e_refresh();
return(0);
}
int e_t_sys_end()
{
extern struct EXT h_error;
/* _go32_want_ctrl_break(1); */
harderr(e_d_handler);
e_chdir(h_error.cn->dirct);
e_abs_refr();
fk_locate(0, 0);
}
int e_switch_screen(int sw)
{
extern struct EXT h_error;
int i, j, x, y, g[4];
static int out_cur_x, out_cur_y, save_sw = 32000;
static PIC *outp = NULL;
PIC *tpic;
if(save_sw == sw) return(0);
save_sw = sw;
if(!sw)
{ g[0] = 2;
fk_mouse(g);
}
tpic = e_open_view(0,0,MAXSCOL-1,MAXSLNS-1, 7, 2);
ScreenGetCursor(&y, &x); /* ???? */
if(outp)
{ e_close_view(outp, 1);
fk_t_locate(out_cur_x, out_cur_y);
}
if(sw)
{ g[0] = 1;
fk_mouse(g);
}
outp = tpic;
out_cur_x = x;
out_cur_y = y;
return(sw);
}
int e_deb_out(FENSTER *f)
{
e_switch_screen(0);
getch();
e_switch_screen(1);
return(0);
}
int e_ctrl_break()
{
setcbrk(0);
_go32_want_ctrl_break(1);
return(0);
}
#undef getenv
struct dj_env { char *var, *string; } **e_djenv = NULL;
int e_djenv_n = 0;
void e_free_djenv()
{
int i;
if(e_djenv)
{ for(i = 0; i < e_djenv_n; i++)
{ if(e_djenv[i])
{ if(e_djenv[i]->var) FREE(e_djenv[i]->var);
if(e_djenv[i]->string) FREE(e_djenv[i]->string);
FREE(e_djenv[i]->var);
}
}
FREE(e_djenv);
}
e_djenv = NULL;
e_djenv_n = 0;
}
void e_add_djvar(char *var, char *string)
{
if(!e_djenv) e_djenv = MALLOC(sizeof(struct dj_env *));
else e_djenv = REALLOC(e_djenv, (e_djenv_n+1) * sizeof(struct dj_env *));
if(!e_djenv) return;
e_djenv[e_djenv_n] = MALLOC(sizeof(struct dj_env));
if(!e_djenv[e_djenv_n]) return;
e_djenv[e_djenv_n]->var = MALLOC((strlen(var)+1) * sizeof(char));
e_djenv[e_djenv_n]->string = MALLOC((strlen(string)+1) * sizeof(char));
if(!e_djenv[e_djenv_n]->var || !e_djenv[e_djenv_n]->var) return;
strcpy(e_djenv[e_djenv_n]->var, var);
strcpy(e_djenv[e_djenv_n]->string, string);
e_djenv_n++;
}
char *e_getdjenv(char *var)
{
int i;
for(i = 0; i < e_djenv_n; i++)
if(!strcmp(e_djenv[i]->var, var)) return(e_djenv[i]->string);
return(NULL);
}
char *e_getdj_var(char *var, char *str, int n)
{
char *tp;
int i, j, k, len;
for(i = 0; var[i] && !isalnum1(var[i]); i++);
if(!(tp = e_getdjenv(var+i))) tp = getenv(var+i);
if(!tp) return(NULL);
for(j = 0; j < n && (str[j] = tp[j]); j++);
if(j == n) str[--j] = '\0';
len = j;
for(k = 0; k < i; k++)
{ if(var[k] == ':')
{ for(j = len; j >= 0 && str[j] != '/' && str[j] != '\\'; j--);
if(j <= 0 || str[j-1] == ':') j++;
str[j] = '\0';
}
else if(var[k] == ';' && len < n-1)
{ str[len] = ';';
str[++len] = '\0';
}
else if(var[k] == '/')
{ for(j = 0; str[j]; j++)
if(str[j] == '\\') str[j] = '/';
}
else if(var[k] == '\\')
{ for(j = 0; str[j]; j++)
if(str[j] == '/') str[j] = '\\';
}
else if(var[k] == '<')
{ for(j = 0; (str[j] = toupper(str[j])); j++);
}
else if(var[k] == '>')
{ for(j = 0; (str[j] = tolower(str[j])); j++);
}
}
return(str);
}
void e_read_djenv()
{
char *tp, var[128], string[256], str[256], tmp[128];
FILE *fp;
int i, j, k;
if(!(tp = getenv("DJGPP"))) return;
if(!(fp = fopen(tp, "r"))) return;
if(e_djenv) e_free_djenv();
while(fgets(str, 256, fp))
{ for(i = 0; str[i] && !isalnum1(str[i]); i++);
for(j = 0; isalnum1(str[i+j]) && (var[j] = str[i+j]); j++);
if(str[i+j] != '=') continue;
var[j] = '\0';
if(i > 0 && str[i-1] == '+' && (tp = getenv(var))) continue;
for(i += j + 1, j = 0; str[i] && str[i] != '\n'; i++, j++)
{ if(str[i] == '%')
{ for(k = 0; (tmp[k] = str[i+1+k]) != '%' && tmp[k]; k++);
tmp[k] = '\0';
if(e_getdj_var(tmp, string+j, 256-j)) j = strlen(string) - 1;
else j--;
i = i + k + 1;
}
else string[j] = str[i];
}
string[j] = '\0';
e_add_djvar(var, string);
}
}
char *e_getenv(char *var)
{
char *tp;
if(!e_djenv) e_read_djenv();
tp = e_getdjenv(var);
if(!tp) tp = getenv(var);
return(tp);
}
/* find attached drives */
struct dirfile *e_mk_drives(void)
{
struct dirfile *df = MALLOC(sizeof(struct dirfile));
int drvs, i;
df->name = MALLOC(sizeof(char *) * 26);
df->anz = 0;
for ( i = 0; i < 26; i++)
{ if(fk_lfw_test(i) >= 0)
{ *(df->name + df->anz) = MALLOC(2 * sizeof(char));
*(*(df->name + df->anz)) = 'A'+i;
*(*(df->name + df->anz)+1) = '\0';
(df->anz)++;
}
}
return(df);
}
#endif /* is DJGPP */
syntax highlighted by Code2HTML, v. 0.9.1