/*----------------*/
/* screen editer */
/*----------------*/
#include < stdio.h >
#include < string.h >
#include < stdlib.h >
#include < ctype.h >
#include < jctype.h >
#include < jctype.h >
#include < jstring.h >
#include < malloc.h >
#include < dos.h >
/*----------------*/
#define COLOR(n, a) printf("\x1b[%d;%dm", n, a)
#define BLACK 30
#define RED 31
#define GREEN 32
#define YELLOW 33
#define BLUE 34
#define MAGENTA 35
#define CYAN 36
#define WHITE 37
#define NORMAL 0
#define UNDERLINE 4
#define BLINK 5
#define REVERSE 7
#define UP 0x0b
#define DOWN 0x0a
#define ESC 0x1b
#define RETURN 0x0d
#define COLOR_OFF 0
#define COLOR_ON 1
#define LEN 1000
#define LOCATE(x, y) printf("\x1b[%d;%dH", y + 1, x + 1)
#define CURSOLE(f) printf("\x1b[>5%c", f ? '1' : 'h')
union REGS ingres;
union REGS outregs;
struct list
{
unsigned char *data;
struct list *back;
struct list *front;
} *head,
*page_head,
*now,
*new,
*new_start, *new_end,
*appoint_start, *appoint_end,
*paste_start, *paste_end;
int paste_flag;
long paste_start_no;
int xp, yp,
len,
width,
scrol,
tab,
color,
char drive;
int cx, cy;
int len_min = 8;
width_min = 20;
int drive_set_flag = 0;
static char filename[80];
static char *workfile[4]
= { "A:WORKO", "A:WORK1", "A:WORK2", "A:WORK3"};
FILE *fp0, *fp1, *fp2, *fp3;
/*----------------*/
void initial_process(void);
void ending_process(void);
void commandline_set(char **p, int n);
void parameter_value_check(void);
void load_process(int flag);
void waku_displat(int x, int y, int len, int width, int color, int zokusei);
void title_display(void);
void file_read(void);
void new_file_make(void);
void new_creat(void);
void hensyu(void);
void rollup_syori(void);
void rolldown_syori(void);
void left_key_syori(void);
void right_key_syori(void);
void up_key_syori(void);
void down_key_syori(void);
void bs_key_syori(void);
int ins_key_syori(int ins_flag);
int insert_syori(unsigned char m, struct list *p, int n);
void over_write_syori(unsigned char *p, int n);
void line_feed_syori(struct list *p, int n);
void buffer_memory_set(unsigned char *buffer, unsigned char *p, int n);
int menu_select(void);
void save_process(void);
void backward_page_check(struct list *p);
void forward_page_renketu(struct list *p);
void backward_page_load(void);
void forward_page_load(void);
void backward_page_save(void);
void forward_page_save(void);
void backward_page_memory_check(void);
void forward_page_memory_check(void);
int paste_locate(void);
void paste_set(void);
void cut_process(void);
void buffer_clear(unsigned char *p, int n);
void jump_process(void);
void hyouji(struct list *p, int s, int sw);
void vram_text_disp(unsigned char *p, int x, int y, int len, int color_sw);
void vram_color_set(unsigned char color_value, int x, int y, int len);
int input(unsigned char buffer[], int x, int y, int len);
int moji_check(unsigned char *buffer, int n);
int inkey(void);
void keybuffer_clear(void);
int scan_esc(void);
int scan_ins(void);
int scan_del(void);
int scan_bs(void);
int scan_rollup(void);
int scan_rolldown(void);
int scan_up(void);
int scan_down(void);
int scan_left(void);
int scan_right(void);
void cursole_blink(int sw)
/*----------------*/
/* main */
/*----------------*/
void main(int argc, char *argv[])
{
initial_process();
commandline_set(&argv[1], argc - 1);
waku_display(xp - 1, yp - 1, len + 2, width + 2, WHITE, NORMAL);
load_process(0);
if (*filename != '\0')
{
hyouji(head, 0, COLOR_ON);
henshu();
}
ending_process();
}
/*----------------*/
/* initial setting */
/*----------------*/
void initial_process(void)
{
xp = 1; yp = 1; len = 20; width = 78; scroll = 1; tab = 4; color = 7;
drive = ' A';
head = paste_start = paste_end = NULL;
paste_flag = 0;
}
/*----------------*/
/* ending process */
/*----------------*/
void ending_process(void)
{
unlink(workfile[0]);
unlink(workfile[1]);
unlink(workfile[2]);
unlink(workfile[3]);
LOCATE(0, yp + len);
COLOR(WHITE, NORMAL);
CURSOLE(1);
}
/*----------------*/
/* comandline set */
/*----------------*/
void commandline_set(char **p, int n)
{
int i;
for(i = 0; i < n; i++)
{
if(**p == ' -')
{
*(*p + 1) = toupper(*(*p + 1));
switch (*(*p + 1))
{
case 'X' : xp = atoi(*p + 2);
break;
case 'Y' : yp = atoi(*p + 2);
break;
case 'L' : len = atoi(*p + 2);
break;
case 'W' : width = atoi(*p + 2);
break;
case 'S' : scroll = atoi(*p + 2);
break;
case 'T' : tab = atoi(*p + 2);
break;
case 'C' : color = atoi(*p + 2);
break;
case 'D' : drive = atoi(*p + 2);
drive = toupper(drive);
break;
default : break;
}
}
else
strcpy(filename, *p);
p++;
}
parameter_value_check();
}
/*----------------*/
/* parameter check */
/*----------------*/
void parameter_value_check(void)
{
if(xp < 1)
xp = 1;
else if(xp > 79 - width_min)
xp = 79 - width_min;
if(yp < 1)
yp = 1;
else if(yp > 23 - len_min)
yp = 23 - len_min;
if (len < len_min)
len = len_min;
if (yp + len > 23)
len = 23 - yp;
if (width < width_min)
width = width_min;
if (xp + width > 79)
width = 79 - xp;
if (color < 1)
color = 1;
else if (color > 7)
color = 7;
color = color * 32 + 1;
if (drive_set_flag == 0)
{
if (drive >= 'A' && drive <= 'Z')
{
*workfile[0] = drive;
fp0 = fopen(workfile[0], "w");
*workfile[0] = *workfile[1];
if (fp0 != NULL)
{
*workfile[0] = drive;
*workfile[1] = drive;
*workfile[2] = drive;
*workfile[3] = drive;
}
fcloseall();
}
}
drive_set_flag = 1;
}
/*----------------*/
/* load transaction flag 0: start 1: edit */
/*----------------*/
void load_process(int flag)
{
static char buffer[80], * work[10];
int i, n, p, sw, set_flag;
struct list *wp;
sw = 0;
while (*filename == '\0' || flag == 1)
{
LOCATE(xp, yp); COLOR(WHITE, REVERSE); printf(" -> ");
sw = input (buffer, xp + 4, yp, width - 4);
if (sw == RETURN && buffer[0] != '\0')
{
set_flag = n = 0;
p = strlen(buffer);
for(i = 0; i < p; i++)
{
if(set_flag == 0 && buffer[i] != ' ')
{
work[n++] = buffer + i;
set_flag = 1;
}
else if (set_flag == 1 && buffer[i] == ' ')
{
buffer[i] = '\0';
if (n == 10)
break;
set_flag = 0;
}
}
hyouji(page_head, 0, COLOR_ON);
commandline_set(&work[0], n);
waku_display(xp - 1, yp - 1, len + 2, width + 2, WHITE, NORMAL);
flag = 2;
}
else if(sw == ESC)
{
flag = 2;
break;
}
}
CURSOLE(0);
LOCATE(xp + width / 2 - strlen(filename) / 2 - 2, yp -1);
COLOR(WHITE, REVERSE); printf("[ %s ]", filename);
if (flag== 0 || sw == RETURN)
{
fp1 = fopen(workfile[1], "w+b");
fp2 = fopen(workfile[2], "w+b");
fcloseall();
wp = head;
while (wp != NULL)
{
free(wp->data);
free(wp);
wp = wp->front;
}
title_display();
file_read();
page_head = now = head;
cx = cy = 0;
}
CURSOLE(1);
}
/*----------------*/
/* title display */
/*----------------*/
void tile_display(void)
{
int hxp, hyp;
hxp = xp + width / 2 - 10;
hyp = yp + len / 2- 2;
COLOR(CYAN, REVERSE);
LOCATE(hxp, hyp); printf(" Screen Editor "); hyp++;
COLOR(WHITE, REVERSE);
LOCATE(hxp, hyp); printf(" By Editor maker. "); hyp += 3;
COLOR(WHITE, BLINK);
LOCATE(hxp, hyp); printf(" Now reading !!!");
}
/*----------------*/
/* display frame */
/*----------------*/
void waku_display(int x, int y, int len, int width, int color, int zokusei)
{
int i;
char space[80];
cURSOLE(0);
for(i = 0; i < width - 2; i++)
space[i] = ' ';
space[i] = '\0';
COLOR(color, zokusei);
LOCATE(x, y); printf(" -");
LOCATE(x+width-1, y); printf("-");
LOCATE(x, y+len-1); printf("-");
LOCATE(x+width-1, y+len-1); printf("-");
for(i = x+1; i <= x+width-2; i++)
{
LOCATE(i, y); printf("--");
LOCATE(i, y+len-1); printf("--");
}
for (i = y+1; i <= y+len-2; i++)
{
LOCATE(x, i);
printf(" | %s |", space);
}
CURSOLe(1);
}
/*----------------*/
/* data lead */
/*----------------*/
void file_read(void)
{
int c, i, n;
long rc;
unsigned char m;
struct list *backward;
fp1 = fopen(filename, "r");
fp2 = fopen(workfile[2], "w+b");
if(fp1 != NULL)
{
head = NULL;
rc = 0;
n = width;
while((c = getc(fp1)) != EOF)
{
m = (unsigned char)c;
if(n == width || iskanji(m) != 0 && n == width -1)
{
rc++;
if(rc <= LEN)
{
new_creat();
if(head == NULL)
{
head = new;
new->back = NULL;
}
else
{
backward->front = new;
new->back = backward;
}
backward = new;
n = 0;
}
else
{
if (rc == LEN +1)
{
new->front = NULL;
new_creat();
}
else
{
fwirte(new->data, width, 1, fp2);
for(i = 0; i < width; i++)
*(new->data + i) = '\0';
}
n = 0;
}
}
*(new->data + n++) = m;
if (iskanji(m) != 0)
{
c = getc(fpl);
m = (unsigned char)c;
*(new->data + n++) = m;
}
else if (m == '\t')
{
while(n % tab != 0 && n < width)
n++;
}
else if(m == '\n')
n = width;
}
new->front = NULL;
if (rc > LEN && n > 0)
{
fwrite(new->data, width, 1, fp2);
free(new->data);
free(new);
}
if (head == NULL)
new_file_make();
}
else
new_file_make();
fcloseall();
}
/*----------------*/
/* make a new file */
/*----------------*/
void new_file_make(void)
{
new_creat();
*(new->data) = '\n';
head = new;
}
/*----------------*/
/* hold new area */
/*----------------*/
void new_creat(void)
{
int i;
new = (struct list *)malloc(sizeof(struct list));
new->data = malloc(width);
for(i = 0; i < width; i++)
*(new->data + i) = '\0';
new->back = new->front = NULL;
}
/*----------------*/
/* edit */
/*----------------*/
void hensyu(void)
{
int ins_flag, edit_flag;
int c, i, hcx, mlen, left_key;
unsigned char m;
struct list *backward;
CURSOLE(1);
page_head = now = head;
cx = cy = 0;
ins_flag = edit_flag = 1;
do{
hcx = cx;
LOCATE(xp + cx, yp + cy);
while ()
}
}
/*----------------*/
/* search */
/*----------------*/
void search_process(void)
{
int c, i, k, flag;
char string[80], buffer[160];
struct list *backward, *forward;
COLOR(WHITE, REVERSE);
LOCATE(xp, yp); printf(" -> ");
if ((c = input(string, xp + 4, yp, width -3)) != ESC)
{
k = strlen(string);
cy = 0;
do {
if ( c == RETURN || c == DOWN)
{
do {
forward_page_check();
for (i = 0; i < width; i++)
buffer[i] = *(now->data + i);
if (now->front != NULL)
for(i = 0; i < k -1; i++)
buffer[i + width] = *((now->front)->data + i);
else
for (i = 0; i < k - 1; i++)
buffer[i + width] = '\0';
flag = 0;
for(i = cx; i < width && flag == 0; i++)
if (strncmp(buffer + i, string, k) == 0)
{
cx = i;
flag = 1;
}
if (flag == 0)
{
page_head = backward = now;
now = now->front;
cx = 0;
}
} while (flag == 0 && now != NULL);
if (flag == 0)
now = backward;
}
else if ( c == UP)
{
do {
backward_page_check();
for (i = 0; i < width; i++)
buffer[i] = *(now->data + i);
if(now->front != NULL)
for(i = 0; i < k - 1; i++)
buffer[i + width] = *((now->front)->data +i);
else
for (i = 0; i < k - 1; i++)
buffer[i + width] = '\0';
flag = 0;
for(i = cx; i >= 0 && flag == 0; i--)
if(strncmp(buffer + i, string, k) == 0)
{
cx = i;
flag = 1;
}
if(flag == 0)
{
page_head = forward = now;
now = now->back;
cx = width - 1;
}
} while (flag == 0 && now != NULL);
if (flag == 0)
now = forward;
}
page_head = now;
hyouji(page_head, 0, COLOR_ON);
if (flag == 1)
{
if (cx + k <= width)
vram_color_set(0xc5, xp + cx, yp, k);
else
{
vram_color_set(0xc5, xp + cx, yp, width - cx);
vram_color_set(0xc5, xp, yp + 1, k - (width - cx));
}
}
else
cx = 0;
LOCATE(xp + cx, yp + cy);
c = getch();
if (c == RETURN || c == DOWN)
{
cx = cx + k;
if (cx >= width && now->front != NULL)
{
now = now->front;
cx = 0;
}
}
else if(c == UP)
{
cx--;
if (cx < 0 && now->back != NULL)
{
now = now->back;
cx = width - 1;
}
}
} while (c != ESC);
}
}
/*----------------*/
/* search */
/*----------------*/
void hyouji(struct list *p, int s, int sw)
{
static char space[80];
int n;
for(n = s; n < len; n++)
{
if (p != NULL)
{
vram_text_disp(p->data, xp, yp+n, width, sw);
p = p->front;
}
else
vram_text_disp(space, xp, yp+n, width, sw);
}
}
/*----------------*/
/* VRAM text display */
/*----------------*/
void vram_text_disp(unsigned char *p, int x, int y, int len, int color_sw)
{
unsigned short w;
char far *vram_t = (char far *)0xa0000000L;
char far *vram_a = (char far *)0xa2000000L;
int n = 0;
vram_t += x * 2 + y * 160;
vram_a += x * 2 + y * 160;
while (n < len)
{
if (*p != '\0')
{
if (iskanji(*p) && iskanji2(*(p+1)))
{
w = (*p << 8) + *(p + 1);
w = jmstojis(w);
w -= 0x2000;
*vram_t++ = (char)(w >> 8);
*vram_t++ = (char)(w & 0x00ff);
if (color_sw == 1)
{
*vram_a++ = color;
vram_a++
}
*vram_t++ = (char)((w >> 8) + 0x80);
*vram_t++ = (char)(w & 0x00ff);
if (color_sw == 1)
{
*vram_a++ = color;
vram_a++;
}
p += 2;
n += 2;
}
else
{
if (*p == '\t')
{
*vram_t++ = ' ';
if (color_sw == 1)
{
*vram_a++ = color;
vram_a++;
}
p++;
}
else if (*p == '\n')
{
*vram_t++ = 0x1f;
if (color_sw == 1)
{
if (color != 0xc1)
*vram_a++ = 0xc1;
else
*vram_a++ = 0xe1;
vram_a++;
}
p++;
}
else
{
*vram_t++ = *p++;
if (color_sw == 1)
{
*vram_a++ = color;
vram_a++
}
}
*vram_t++ = 0;
n++;
}
}
else
{
*vram_t++ = ' ';
*vram_t++ = 0;
if (color_sw == 1)
{
*vram_a++ = color;
vram_a++;
}
*p++;
n++;
}
}
}
void vram_color_set(unsigned char color_value, int x, int y, int len)
{
char far *vram = (char far *)0xa200000L;
int c = 0;
}