Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Synchronet
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Main
Synchronet
Commits
dad57367
Commit
dad57367
authored
20 years ago
by
deuce
Browse files
Options
Downloads
Patches
Plain Diff
Add ctputs() to handle backscroll info.
parent
60652fa9
No related branches found
No related tags found
No related merge requests found
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
src/conio/cterm.c
+253
-190
253 additions, 190 deletions
src/conio/cterm.c
src/conio/cterm.h
+23
-0
23 additions, 0 deletions
src/conio/cterm.h
with
276 additions
and
190 deletions
src/conio/cterm.c
+
253
−
190
View file @
dad57367
...
@@ -8,27 +8,7 @@
...
@@ -8,27 +8,7 @@
#define BUFSIZE 2048
#define BUFSIZE 2048
struct
terminal
{
struct
cterminal
cterm
;
int
height
;
int
width
;
int
x
;
int
y
;
char
*
buffer
;
int
attr
;
int
save_xpos
;
int
save_ypos
;
char
escbuf
[
1024
];
int
sequence
;
char
musicbuf
[
1024
];
int
music
;
char
*
scrollback
;
int
backpos
;
int
backlines
;
int
xpos
;
int
ypos
;
};
static
struct
terminal
term
;
/* const int tabs[11]={1,8,16,24,32,40,48,56,64,72,80}; */
/* const int tabs[11]={1,8,16,24,32,40,48,56,64,72,80}; */
const
int
tabs
[
11
]
=
{
9
,
17
,
25
,
33
,
41
,
49
,
57
,
65
,
73
,
80
,
80
.
1
};
const
int
tabs
[
11
]
=
{
9
,
17
,
25
,
33
,
41
,
49
,
57
,
65
,
73
,
80
,
80
.
1
};
...
@@ -36,7 +16,7 @@ const int tabs[11]={9,17,25,33,41,49,57,65,73,80,80.1};
...
@@ -36,7 +16,7 @@ const int tabs[11]={9,17,25,33,41,49,57,65,73,80,80.1};
void
play_music
(
void
)
void
play_music
(
void
)
{
{
/* ToDo Music code parsing stuff */
/* ToDo Music code parsing stuff */
term
.
music
=
0
;
c
term
.
music
=
0
;
}
}
void
scrolldown
(
void
)
void
scrolldown
(
void
)
...
@@ -44,15 +24,15 @@ void scrolldown(void)
...
@@ -44,15 +24,15 @@ void scrolldown(void)
char
*
buf
;
char
*
buf
;
int
i
,
j
;
int
i
,
j
;
buf
=
(
char
*
)
malloc
(
term
.
width
*
(
term
.
height
-
1
)
*
2
);
buf
=
(
char
*
)
malloc
(
c
term
.
width
*
(
c
term
.
height
-
1
)
*
2
);
gettext
(
term
.
x
+
1
,
term
.
y
+
1
,
term
.
x
+
term
.
width
,
term
.
y
+
term
.
height
-
1
,
buf
);
gettext
(
c
term
.
x
,
c
term
.
y
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
c
term
.
height
-
2
,
buf
);
puttext
(
term
.
x
+
1
,
term
.
y
+
2
,
term
.
x
+
term
.
width
,
term
.
y
+
term
.
height
,
buf
);
puttext
(
c
term
.
x
,
c
term
.
y
+
1
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
c
term
.
height
-
1
,
buf
);
j
=
0
;
j
=
0
;
for
(
i
=
0
;
i
<
term
.
width
;
i
++
)
{
for
(
i
=
0
;
i
<
c
term
.
width
;
i
++
)
{
buf
[
j
++
]
=
' '
;
buf
[
j
++
]
=
' '
;
buf
[
j
++
]
=
term
.
attr
;
buf
[
j
++
]
=
c
term
.
attr
;
}
}
puttext
(
term
.
x
+
1
,
term
.
y
+
1
,
term
.
x
+
term
.
width
,
term
.
y
+
1
,
buf
);
puttext
(
c
term
.
x
,
c
term
.
y
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
,
buf
);
free
(
buf
);
free
(
buf
);
}
}
...
@@ -61,23 +41,23 @@ void scrollup(void)
...
@@ -61,23 +41,23 @@ void scrollup(void)
char
*
buf
;
char
*
buf
;
int
i
,
j
;
int
i
,
j
;
term
.
backpos
++
;
c
term
.
backpos
++
;
if
(
term
.
scrollback
!=
NULL
)
{
if
(
c
term
.
scrollback
!=
NULL
)
{
if
(
term
.
backpos
>
term
.
backlines
)
{
if
(
c
term
.
backpos
>
c
term
.
backlines
)
{
memmove
(
term
.
scrollback
,
term
.
scrollback
+
term
.
width
*
2
,
term
.
width
*
2
*
(
term
.
backlines
-
1
));
memmove
(
c
term
.
scrollback
,
c
term
.
scrollback
+
c
term
.
width
*
2
,
c
term
.
width
*
2
*
(
c
term
.
backlines
-
1
));
term
.
backpos
--
;
c
term
.
backpos
--
;
}
}
gettext
(
term
.
x
+
1
,
term
.
y
+
1
,
term
.
x
+
term
.
width
,
term
.
y
+
1
,
term
.
scrollback
+
(
term
.
backpos
-
1
)
*
term
.
width
*
2
);
gettext
(
c
term
.
x
,
c
term
.
y
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
,
c
term
.
scrollback
+
(
c
term
.
backpos
-
1
)
*
c
term
.
width
*
2
);
}
}
buf
=
(
char
*
)
malloc
(
term
.
width
*
(
term
.
height
-
1
)
*
2
);
buf
=
(
char
*
)
malloc
(
c
term
.
width
*
(
c
term
.
height
-
1
)
*
2
);
gettext
(
term
.
x
+
1
,
term
.
y
+
2
,
term
.
x
+
term
.
width
,
term
.
y
+
term
.
height
,
buf
);
gettext
(
c
term
.
x
,
c
term
.
y
+
1
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
c
term
.
height
-
1
,
buf
);
puttext
(
term
.
x
+
1
,
term
.
y
+
1
,
term
.
x
+
term
.
width
,
term
.
y
+
term
.
height
-
1
,
buf
);
puttext
(
c
term
.
x
,
c
term
.
y
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
c
term
.
height
-
2
,
buf
);
j
=
0
;
j
=
0
;
for
(
i
=
0
;
i
<
term
.
width
;
i
++
)
{
for
(
i
=
0
;
i
<
c
term
.
width
;
i
++
)
{
buf
[
j
++
]
=
' '
;
buf
[
j
++
]
=
' '
;
buf
[
j
++
]
=
term
.
attr
;
buf
[
j
++
]
=
c
term
.
attr
;
}
}
puttext
(
term
.
x
+
1
,
term
.
y
+
term
.
height
,
term
.
x
+
term
.
width
,
term
.
y
+
term
.
height
,
buf
);
puttext
(
c
term
.
x
,
c
term
.
y
+
c
term
.
height
-
1
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
c
term
.
height
-
1
,
buf
);
free
(
buf
);
free
(
buf
);
}
}
...
@@ -90,9 +70,9 @@ void clear2bol(void)
...
@@ -90,9 +70,9 @@ void clear2bol(void)
j
=
0
;
j
=
0
;
for
(
i
=
1
;
i
<=
wherex
();
i
++
)
{
for
(
i
=
1
;
i
<=
wherex
();
i
++
)
{
buf
[
j
++
]
=
' '
;
buf
[
j
++
]
=
' '
;
buf
[
j
++
]
=
term
.
attr
;
buf
[
j
++
]
=
c
term
.
attr
;
}
}
puttext
(
term
.
x
+
1
,
term
.
y
+
wherey
(),
term
.
x
+
wherex
(),
term
.
y
+
wherey
(),
buf
);
puttext
(
c
term
.
x
+
1
,
c
term
.
y
+
wherey
(),
c
term
.
x
+
wherex
(),
c
term
.
y
+
wherey
(),
buf
);
free
(
buf
);
free
(
buf
);
}
}
...
@@ -109,13 +89,13 @@ void clearscreen(char attr)
...
@@ -109,13 +89,13 @@ void clearscreen(char attr)
char
*
buf
;
char
*
buf
;
int
x
,
y
,
j
;
int
x
,
y
,
j
;
if
(
term
.
scrollback
!=
NULL
)
{
if
(
c
term
.
scrollback
!=
NULL
)
{
term
.
backpos
+=
term
.
height
;
c
term
.
backpos
+=
c
term
.
height
;
if
(
term
.
backpos
>
term
.
backlines
)
{
if
(
c
term
.
backpos
>
c
term
.
backlines
)
{
memmove
(
term
.
scrollback
,
term
.
scrollback
+
term
.
width
*
2
*
(
term
.
backpos
-
term
.
backlines
),
term
.
width
*
2
*
(
term
.
backlines
-
(
term
.
backpos
-
term
.
backlines
)));
memmove
(
c
term
.
scrollback
,
c
term
.
scrollback
+
c
term
.
width
*
2
*
(
c
term
.
backpos
-
c
term
.
backlines
),
c
term
.
width
*
2
*
(
c
term
.
backlines
-
(
c
term
.
backpos
-
c
term
.
backlines
)));
term
.
backpos
=
term
.
backlines
;
c
term
.
backpos
=
c
term
.
backlines
;
}
}
gettext
(
term
.
x
+
1
,
term
.
y
+
1
,
term
.
x
+
term
.
width
,
term
.
y
+
term
.
height
,
term
.
scrollback
+
(
term
.
backpos
-
term
.
height
)
*
term
.
width
*
2
);
gettext
(
c
term
.
x
,
c
term
.
y
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
c
term
.
height
-
1
,
c
term
.
scrollback
+
(
c
term
.
backpos
-
c
term
.
height
)
*
c
term
.
width
*
2
);
}
}
clrscr
();
clrscr
();
}
}
...
@@ -128,21 +108,21 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -128,21 +108,21 @@ void do_ansi(char *retbuf, int retsize)
int
i
,
j
,
k
;
int
i
,
j
,
k
;
int
row
,
col
;
int
row
,
col
;
switch
(
term
.
escbuf
[
0
])
{
switch
(
c
term
.
escbuf
[
0
])
{
case
'['
:
case
'['
:
/* ANSI stuff */
/* ANSI stuff */
p
=
term
.
escbuf
+
strlen
(
term
.
escbuf
)
-
1
;
p
=
c
term
.
escbuf
+
strlen
(
c
term
.
escbuf
)
-
1
;
switch
(
*
p
)
{
switch
(
*
p
)
{
case
'@'
:
/* Insert Char */
case
'@'
:
/* Insert Char */
i
=
wherex
();
i
=
wherex
();
j
=
wherey
();
j
=
wherey
();
gettext
(
term
.
x
+
wherex
(),
term
.
y
+
wherey
(),
term
.
x
+
term
.
width
-
1
,
term
.
y
+
wherey
(),
tmp
);
gettext
(
c
term
.
x
+
wherex
(),
c
term
.
y
+
wherey
(),
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
wherey
(),
tmp
);
putch
(
' '
);
putch
(
' '
);
puttext
(
term
.
x
+
wherex
()
+
1
,
term
.
y
+
wherey
(),
term
.
x
+
term
.
width
,
term
.
y
+
wherey
(),
tmp
);
puttext
(
c
term
.
x
+
wherex
()
+
1
,
c
term
.
y
+
wherey
(),
c
term
.
x
+
c
term
.
width
,
c
term
.
y
+
wherey
(),
tmp
);
gotoxy
(
i
,
j
);
gotoxy
(
i
,
j
);
break
;
break
;
case
'A'
:
/* Cursor Up */
case
'A'
:
/* Cursor Up */
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
if
(
i
==
0
)
if
(
i
==
0
)
i
=
1
;
i
=
1
;
i
=
wherey
()
-
i
;
i
=
wherey
()
-
i
;
...
@@ -151,25 +131,25 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -151,25 +131,25 @@ void do_ansi(char *retbuf, int retsize)
gotoxy
(
wherex
(),
i
);
gotoxy
(
wherex
(),
i
);
break
;
break
;
case
'B'
:
/* Cursor Down */
case
'B'
:
/* Cursor Down */
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
if
(
i
==
0
)
if
(
i
==
0
)
i
=
1
;
i
=
1
;
i
=
wherey
()
+
i
;
i
=
wherey
()
+
i
;
if
(
i
>
term
.
height
)
if
(
i
>
c
term
.
height
)
i
=
term
.
height
;
i
=
c
term
.
height
;
gotoxy
(
wherex
(),
i
);
gotoxy
(
wherex
(),
i
);
break
;
break
;
case
'C'
:
/* Cursor Right */
case
'C'
:
/* Cursor Right */
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
if
(
i
==
0
)
if
(
i
==
0
)
i
=
1
;
i
=
1
;
i
=
wherex
()
+
i
;
i
=
wherex
()
+
i
;
if
(
i
>
term
.
width
)
if
(
i
>
c
term
.
width
)
i
=
term
.
width
;
i
=
c
term
.
width
;
gotoxy
(
i
,
wherey
());
gotoxy
(
i
,
wherey
());
break
;
break
;
case
'D'
:
/* Cursor Left */
case
'D'
:
/* Cursor Left */
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
if
(
i
==
0
)
if
(
i
==
0
)
i
=
1
;
i
=
1
;
i
=
wherex
()
-
i
;
i
=
wherex
()
-
i
;
...
@@ -178,7 +158,7 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -178,7 +158,7 @@ void do_ansi(char *retbuf, int retsize)
gotoxy
(
i
,
wherey
());
gotoxy
(
i
,
wherey
());
break
;
break
;
case
'E'
:
case
'E'
:
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
if
(
i
==
0
)
if
(
i
==
0
)
i
=
1
;
i
=
1
;
i
=
wherey
()
+
i
;
i
=
wherey
()
+
i
;
...
@@ -190,8 +170,8 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -190,8 +170,8 @@ void do_ansi(char *retbuf, int retsize)
row
=
1
;
row
=
1
;
col
=
1
;
col
=
1
;
*
(
p
--
)
=
0
;
*
(
p
--
)
=
0
;
if
(
strlen
(
term
.
escbuf
)
>
1
)
{
if
(
strlen
(
c
term
.
escbuf
)
>
1
)
{
if
((
p
=
strtok
(
term
.
escbuf
+
1
,
";"
))
!=
NULL
)
{
if
((
p
=
strtok
(
c
term
.
escbuf
+
1
,
";"
))
!=
NULL
)
{
row
=
atoi
(
p
);
row
=
atoi
(
p
);
if
((
p
=
strtok
(
NULL
,
";"
))
!=
NULL
)
{
if
((
p
=
strtok
(
NULL
,
";"
))
!=
NULL
)
{
col
=
atoi
(
p
);
col
=
atoi
(
p
);
...
@@ -202,49 +182,49 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -202,49 +182,49 @@ void do_ansi(char *retbuf, int retsize)
row
=
1
;
row
=
1
;
if
(
col
<
1
)
if
(
col
<
1
)
col
=
1
;
col
=
1
;
if
(
row
>
term
.
height
)
if
(
row
>
c
term
.
height
)
row
=
term
.
height
;
row
=
c
term
.
height
;
if
(
col
>
term
.
width
)
if
(
col
>
c
term
.
width
)
col
=
term
.
width
;
col
=
c
term
.
width
;
gotoxy
(
col
,
row
);
gotoxy
(
col
,
row
);
break
;
break
;
case
'J'
:
case
'J'
:
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
switch
(
i
)
{
switch
(
i
)
{
case
0
:
case
0
:
clear2eol
();
clear2eol
();
p2
=
(
char
*
)
malloc
(
term
.
width
*
2
);
p2
=
(
char
*
)
malloc
(
c
term
.
width
*
2
);
j
=
0
;
j
=
0
;
for
(
i
=
0
;
i
<
term
.
width
;
i
++
)
{
for
(
i
=
0
;
i
<
c
term
.
width
;
i
++
)
{
p2
[
j
++
]
=
' '
;
p2
[
j
++
]
=
' '
;
p2
[
j
++
]
=
term
.
attr
;
p2
[
j
++
]
=
c
term
.
attr
;
}
}
for
(
i
=
wherey
()
+
1
;
i
<=
term
.
height
;
i
++
)
{
for
(
i
=
wherey
()
+
1
;
i
<=
c
term
.
height
;
i
++
)
{
puttext
(
term
.
x
+
1
,
term
.
y
+
i
,
term
.
x
+
term
.
width
,
term
.
y
+
i
,
p2
);
puttext
(
c
term
.
x
+
1
,
c
term
.
y
+
i
,
c
term
.
x
+
c
term
.
width
,
c
term
.
y
+
i
,
p2
);
}
}
free
(
p2
);
free
(
p2
);
break
;
break
;
case
1
:
case
1
:
clear2bol
();
clear2bol
();
p2
=
(
char
*
)
malloc
(
term
.
width
*
2
);
p2
=
(
char
*
)
malloc
(
c
term
.
width
*
2
);
j
=
0
;
j
=
0
;
for
(
i
=
0
;
i
<
term
.
width
;
i
++
)
{
for
(
i
=
0
;
i
<
c
term
.
width
;
i
++
)
{
p2
[
j
++
]
=
' '
;
p2
[
j
++
]
=
' '
;
p2
[
j
++
]
=
term
.
attr
;
p2
[
j
++
]
=
c
term
.
attr
;
}
}
for
(
i
=
wherey
()
-
1
;
i
>=
1
;
i
--
)
{
for
(
i
=
wherey
()
-
1
;
i
>=
1
;
i
--
)
{
puttext
(
term
.
x
+
1
,
term
.
y
+
i
,
term
.
x
+
term
.
width
,
term
.
y
+
i
,
p2
);
puttext
(
c
term
.
x
+
1
,
c
term
.
y
+
i
,
c
term
.
x
+
c
term
.
width
,
c
term
.
y
+
i
,
p2
);
}
}
free
(
p2
);
free
(
p2
);
break
;
break
;
case
2
:
case
2
:
clearscreen
(
term
.
attr
);
clearscreen
(
c
term
.
attr
);
gotoxy
(
1
,
1
);
gotoxy
(
1
,
1
);
break
;
break
;
}
}
break
;
break
;
case
'K'
:
case
'K'
:
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
switch
(
i
)
{
switch
(
i
)
{
case
0
:
case
0
:
clear2eol
();
clear2eol
();
...
@@ -253,57 +233,57 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -253,57 +233,57 @@ void do_ansi(char *retbuf, int retsize)
clear2bol
();
clear2bol
();
break
;
break
;
case
2
:
case
2
:
p2
=
(
char
*
)
malloc
(
term
.
width
*
2
);
p2
=
(
char
*
)
malloc
(
c
term
.
width
*
2
);
j
=
0
;
j
=
0
;
for
(
i
=
0
;
i
<
term
.
width
;
i
++
)
{
for
(
i
=
0
;
i
<
c
term
.
width
;
i
++
)
{
p2
[
j
++
]
=
' '
;
p2
[
j
++
]
=
' '
;
p2
[
j
++
]
=
term
.
attr
;
p2
[
j
++
]
=
c
term
.
attr
;
}
}
puttext
(
term
.
x
+
1
,
term
.
y
+
wherey
(),
term
.
x
+
term
.
width
,
term
.
y
+
wherey
(),
p2
);
puttext
(
c
term
.
x
+
1
,
c
term
.
y
+
wherey
(),
c
term
.
x
+
c
term
.
width
,
c
term
.
y
+
wherey
(),
p2
);
free
(
p2
);
free
(
p2
);
break
;
break
;
}
}
break
;
break
;
case
'L'
:
case
'L'
:
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
if
(
i
==
0
)
if
(
i
==
0
)
i
=
1
;
i
=
1
;
if
(
i
>
term
.
height
-
wherey
())
if
(
i
>
c
term
.
height
-
wherey
())
i
=
term
.
height
-
wherey
();
i
=
c
term
.
height
-
wherey
();
if
(
i
<
term
.
height
-
wherey
())
{
if
(
i
<
c
term
.
height
-
wherey
())
{
p2
=
(
char
*
)
malloc
((
term
.
height
-
wherey
()
-
i
)
*
term
.
width
*
2
);
p2
=
(
char
*
)
malloc
((
c
term
.
height
-
wherey
()
-
i
)
*
c
term
.
width
*
2
);
gettext
(
term
.
x
+
1
,
term
.
y
+
wherey
(),
term
.
x
+
term
.
width
,
wherey
()
+
(
term
.
height
-
wherey
()
-
i
),
p2
);
gettext
(
c
term
.
x
+
1
,
c
term
.
y
+
wherey
(),
c
term
.
x
+
c
term
.
width
,
wherey
()
+
(
c
term
.
height
-
wherey
()
-
i
),
p2
);
puttext
(
term
.
x
+
1
,
term
.
y
+
wherey
()
+
i
,
term
.
x
+
term
.
width
,
wherey
()
+
(
term
.
height
-
wherey
()),
p2
);
puttext
(
c
term
.
x
+
1
,
c
term
.
y
+
wherey
()
+
i
,
c
term
.
x
+
c
term
.
width
,
wherey
()
+
(
c
term
.
height
-
wherey
()),
p2
);
j
=
0
;
j
=
0
;
free
(
p2
);
free
(
p2
);
}
}
p2
=
(
char
*
)
malloc
(
term
.
width
*
2
);
p2
=
(
char
*
)
malloc
(
c
term
.
width
*
2
);
j
=
0
;
j
=
0
;
for
(
k
=
0
;
k
<
term
.
width
;
k
++
)
{
for
(
k
=
0
;
k
<
c
term
.
width
;
k
++
)
{
p2
[
j
++
]
=
' '
;
p2
[
j
++
]
=
' '
;
p2
[
j
++
]
=
term
.
attr
;
p2
[
j
++
]
=
c
term
.
attr
;
}
}
for
(
i
=
0
;
j
<
i
;
i
++
)
{
for
(
i
=
0
;
j
<
i
;
i
++
)
{
puttext
(
term
.
x
+
1
,
term
.
y
+
i
,
term
.
x
+
term
.
width
,
term
.
y
+
i
,
p2
);
puttext
(
c
term
.
x
+
1
,
c
term
.
y
+
i
,
c
term
.
x
+
c
term
.
width
,
c
term
.
y
+
i
,
p2
);
}
}
free
(
p2
);
free
(
p2
);
break
;
break
;
case
'M'
:
case
'M'
:
case
'N'
:
case
'N'
:
term
.
music
=
1
;
c
term
.
music
=
1
;
break
;
break
;
case
'P'
:
/* Delete char */
case
'P'
:
/* Delete char */
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
if
(
i
==
0
)
if
(
i
==
0
)
i
=
1
;
i
=
1
;
if
(
i
>
term
.
width
-
wherex
())
if
(
i
>
c
term
.
width
-
wherex
())
i
=
term
.
width
-
wherex
();
i
=
c
term
.
width
-
wherex
();
p2
=
(
char
*
)
malloc
((
term
.
width
-
wherex
())
*
2
);
p2
=
(
char
*
)
malloc
((
c
term
.
width
-
wherex
())
*
2
);
gettext
(
term
.
x
+
wherex
(),
term
.
y
+
wherey
(),
term
.
x
+
term
.
width
,
term
.
y
+
wherey
(),
p2
);
gettext
(
c
term
.
x
+
wherex
(),
c
term
.
y
+
wherey
(),
c
term
.
x
+
c
term
.
width
,
c
term
.
y
+
wherey
(),
p2
);
memmove
(
p2
,
p2
+
(
i
*
2
),(
term
.
width
-
wherex
()
-
i
)
*
2
);
memmove
(
p2
,
p2
+
(
i
*
2
),(
c
term
.
width
-
wherex
()
-
i
)
*
2
);
for
(
i
=
(
term
.
width
-
wherex
())
*
2
-
2
;
i
>=
wherex
();
i
-=
2
)
for
(
i
=
(
c
term
.
width
-
wherex
())
*
2
-
2
;
i
>=
wherex
();
i
-=
2
)
p2
[
i
]
=
' '
;
p2
[
i
]
=
' '
;
puttext
(
term
.
x
+
wherex
(),
term
.
y
+
wherey
(),
term
.
x
+
term
.
width
,
term
.
y
+
wherey
(),
p2
);
puttext
(
c
term
.
x
+
wherex
(),
c
term
.
y
+
wherey
(),
c
term
.
x
+
c
term
.
width
,
c
term
.
y
+
wherey
(),
p2
);
break
;
break
;
case
'S'
:
case
'S'
:
scrollup
();
scrollup
();
...
@@ -337,109 +317,109 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -337,109 +317,109 @@ void do_ansi(char *retbuf, int retsize)
break
;
break
;
case
'm'
:
case
'm'
:
*
(
p
--
)
=
0
;
*
(
p
--
)
=
0
;
p2
=
term
.
escbuf
+
1
;
p2
=
c
term
.
escbuf
+
1
;
if
(
p2
>
p
)
{
if
(
p2
>
p
)
{
term
.
attr
=
7
;
c
term
.
attr
=
7
;
break
;
break
;
}
}
while
((
p
=
strtok
(
p2
,
";"
))
!=
NULL
)
{
while
((
p
=
strtok
(
p2
,
";"
))
!=
NULL
)
{
p2
=
NULL
;
p2
=
NULL
;
switch
(
atoi
(
p
))
{
switch
(
atoi
(
p
))
{
case
0
:
case
0
:
term
.
attr
=
7
;
c
term
.
attr
=
7
;
break
;
break
;
case
1
:
case
1
:
term
.
attr
|=
8
;
c
term
.
attr
|=
8
;
break
;
break
;
case
2
:
case
2
:
term
.
attr
&=
247
;
c
term
.
attr
&=
247
;
break
;
break
;
case
4
:
/* Underscore */
case
4
:
/* Underscore */
break
;
break
;
case
5
:
case
5
:
case
6
:
case
6
:
term
.
attr
|=
128
;
c
term
.
attr
|=
128
;
break
;
break
;
case
7
:
case
7
:
i
=
term
.
attr
&
7
;
i
=
c
term
.
attr
&
7
;
j
=
term
.
attr
&
112
;
j
=
c
term
.
attr
&
112
;
term
.
attr
&=
136
;
c
term
.
attr
&=
136
;
term
.
attr
|=
j
>>
4
;
c
term
.
attr
|=
j
>>
4
;
term
.
attr
|=
i
<<
4
;
c
term
.
attr
|=
i
<<
4
;
break
;
break
;
case
8
:
case
8
:
j
=
term
.
attr
&
112
;
j
=
c
term
.
attr
&
112
;
term
.
attr
&=
112
;
c
term
.
attr
&=
112
;
term
.
attr
|=
j
>>
4
;
c
term
.
attr
|=
j
>>
4
;
break
;
break
;
case
30
:
case
30
:
term
.
attr
&=
248
;
c
term
.
attr
&=
248
;
break
;
break
;
case
31
:
case
31
:
term
.
attr
&=
248
;
c
term
.
attr
&=
248
;
term
.
attr
|=
4
;
c
term
.
attr
|=
4
;
break
;
break
;
case
32
:
case
32
:
term
.
attr
&=
248
;
c
term
.
attr
&=
248
;
term
.
attr
|=
2
;
c
term
.
attr
|=
2
;
break
;
break
;
case
33
:
case
33
:
term
.
attr
&=
248
;
c
term
.
attr
&=
248
;
term
.
attr
|=
6
;
c
term
.
attr
|=
6
;
break
;
break
;
case
34
:
case
34
:
term
.
attr
&=
248
;
c
term
.
attr
&=
248
;
term
.
attr
|=
1
;
c
term
.
attr
|=
1
;
break
;
break
;
case
35
:
case
35
:
term
.
attr
&=
248
;
c
term
.
attr
&=
248
;
term
.
attr
|=
5
;
c
term
.
attr
|=
5
;
break
;
break
;
case
36
:
case
36
:
term
.
attr
&=
248
;
c
term
.
attr
&=
248
;
term
.
attr
|=
3
;
c
term
.
attr
|=
3
;
break
;
break
;
case
37
:
case
37
:
term
.
attr
&=
248
;
c
term
.
attr
&=
248
;
term
.
attr
|=
7
;
c
term
.
attr
|=
7
;
break
;
break
;
case
40
:
case
40
:
term
.
attr
&=
143
;
c
term
.
attr
&=
143
;
break
;
break
;
case
41
:
case
41
:
term
.
attr
&=
143
;
c
term
.
attr
&=
143
;
term
.
attr
|=
4
<<
4
;
c
term
.
attr
|=
4
<<
4
;
break
;
break
;
case
42
:
case
42
:
term
.
attr
&=
143
;
c
term
.
attr
&=
143
;
term
.
attr
|=
2
<<
4
;
c
term
.
attr
|=
2
<<
4
;
break
;
break
;
case
43
:
case
43
:
term
.
attr
&=
143
;
c
term
.
attr
&=
143
;
term
.
attr
|=
6
<<
4
;
c
term
.
attr
|=
6
<<
4
;
break
;
break
;
case
44
:
case
44
:
term
.
attr
&=
143
;
c
term
.
attr
&=
143
;
term
.
attr
|=
1
<<
4
;
c
term
.
attr
|=
1
<<
4
;
break
;
break
;
case
45
:
case
45
:
term
.
attr
&=
143
;
c
term
.
attr
&=
143
;
term
.
attr
|=
5
<<
4
;
c
term
.
attr
|=
5
<<
4
;
break
;
break
;
case
46
:
case
46
:
term
.
attr
&=
143
;
c
term
.
attr
&=
143
;
term
.
attr
|=
3
<<
4
;
c
term
.
attr
|=
3
<<
4
;
break
;
break
;
case
47
:
case
47
:
term
.
attr
&=
143
;
c
term
.
attr
&=
143
;
term
.
attr
|=
7
<<
4
;
c
term
.
attr
|=
7
<<
4
;
break
;
break
;
}
}
}
}
textattr
(
term
.
attr
);
textattr
(
c
term
.
attr
);
break
;
break
;
case
'n'
:
case
'n'
:
i
=
atoi
(
term
.
escbuf
+
1
);
i
=
atoi
(
c
term
.
escbuf
+
1
);
switch
(
i
)
{
switch
(
i
)
{
case
6
:
case
6
:
if
(
retbuf
!=
NULL
)
{
if
(
retbuf
!=
NULL
)
{
...
@@ -450,7 +430,7 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -450,7 +430,7 @@ void do_ansi(char *retbuf, int retsize)
break
;
break
;
case
255
:
case
255
:
if
(
retbuf
!=
NULL
)
{
if
(
retbuf
!=
NULL
)
{
sprintf
(
tmp
,
"%c[%d;%dR"
,
27
,
term
.
height
,
term
.
width
);
sprintf
(
tmp
,
"%c[%d;%dR"
,
27
,
c
term
.
height
,
c
term
.
width
);
if
(
strlen
(
retbuf
)
+
strlen
(
tmp
)
<
retsize
)
if
(
strlen
(
retbuf
)
+
strlen
(
tmp
)
<
retsize
)
strcat
(
retbuf
,
tmp
);
strcat
(
retbuf
,
tmp
);
}
}
...
@@ -464,13 +444,13 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -464,13 +444,13 @@ void do_ansi(char *retbuf, int retsize)
case
'r'
:
/* ToDo? Scrolling reigon */
case
'r'
:
/* ToDo? Scrolling reigon */
break
;
break
;
case
's'
:
case
's'
:
term
.
save_xpos
=
wherex
();
c
term
.
save_xpos
=
wherex
();
term
.
save_ypos
=
wherey
();
c
term
.
save_ypos
=
wherey
();
break
;
break
;
case
'u'
:
case
'u'
:
if
(
term
.
save_ypos
>
0
&&
term
.
save_ypos
<=
term
.
height
if
(
c
term
.
save_ypos
>
0
&&
c
term
.
save_ypos
<=
c
term
.
height
&&
term
.
save_xpos
>
0
&&
term
.
save_xpos
<=
term
.
width
)
{
&&
c
term
.
save_xpos
>
0
&&
c
term
.
save_xpos
<=
c
term
.
width
)
{
gotoxy
(
term
.
save_xpos
,
term
.
save_ypos
);
gotoxy
(
c
term
.
save_xpos
,
c
term
.
save_ypos
);
}
}
break
;
break
;
case
'y'
:
/* ToDo? VT100 Tests */
case
'y'
:
/* ToDo? VT100 Tests */
...
@@ -489,34 +469,117 @@ void do_ansi(char *retbuf, int retsize)
...
@@ -489,34 +469,117 @@ void do_ansi(char *retbuf, int retsize)
/* ToDo: Reset Terminal */
/* ToDo: Reset Terminal */
break
;
break
;
}
}
term
.
escbuf
[
0
]
=
0
;
c
term
.
escbuf
[
0
]
=
0
;
term
.
sequence
=
0
;
c
term
.
sequence
=
0
;
}
}
void
cterm_init
(
int
height
,
int
width
,
int
xpos
,
int
ypos
,
int
backlines
,
unsigned
char
*
scrollback
)
void
cterm_init
(
int
height
,
int
width
,
int
xpos
,
int
ypos
,
int
backlines
,
unsigned
char
*
scrollback
)
{
{
term
.
x
=
xpos
;
c
term
.
x
=
xpos
;
term
.
y
=
ypos
;
c
term
.
y
=
ypos
;
term
.
height
=
height
;
c
term
.
height
=
height
;
term
.
width
=
width
;
c
term
.
width
=
width
;
term
.
attr
=
7
;
c
term
.
attr
=
7
;
term
.
save_xpos
=
0
;
c
term
.
save_xpos
=
0
;
term
.
save_ypos
=
0
;
c
term
.
save_ypos
=
0
;
term
.
escbuf
[
0
]
=
0
;
c
term
.
escbuf
[
0
]
=
0
;
term
.
sequence
=
0
;
c
term
.
sequence
=
0
;
term
.
music
=
0
;
c
term
.
music
=
0
;
term
.
backpos
=
0
;
c
term
.
backpos
=
0
;
term
.
backlines
=
backlines
;
c
term
.
backlines
=
backlines
;
term
.
scrollback
=
scrollback
;
c
term
.
scrollback
=
scrollback
;
if
(
term
.
scrollback
!=
NULL
)
if
(
c
term
.
scrollback
!=
NULL
)
memset
(
term
.
scrollback
,
0
,
term
.
width
*
2
*
term
.
backlines
);
memset
(
c
term
.
scrollback
,
0
,
c
term
.
width
*
2
*
c
term
.
backlines
);
textattr
(
term
.
attr
);
textattr
(
c
term
.
attr
);
_setcursortype
(
_NORMALCURSOR
);
_setcursortype
(
_NORMALCURSOR
);
window
(
term
.
x
,
term
.
y
,
term
.
x
+
term
.
width
-
1
,
term
.
y
+
term
.
height
-
1
);
window
(
c
term
.
x
,
c
term
.
y
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
c
term
.
height
-
1
);
clrscr
();
clrscr
();
gotoxy
(
1
,
1
);
gotoxy
(
1
,
1
);
}
}
void
ctputs
(
char
*
buf
)
{
char
*
outp
;
char
*
p
;
char
outline
[
80
];
int
oldscroll
;
int
cx
;
int
cy
;
int
i
;
p
=
buf
;
outp
=
buf
;
oldscroll
=
_wscroll
;
_wscroll
=
0
;
cx
=
wherex
();
cy
=
wherey
();
for
(
p
=
buf
;
*
p
;
p
++
)
{
switch
(
*
p
)
{
case
'\r'
:
cx
=
1
;
break
;
case
'\n'
:
if
(
cy
==
cterm
.
height
)
{
*
p
=
0
;
cputs
(
outp
);
outp
=
p
+
1
;
scrollup
();
}
else
cy
++
;
break
;
case
'\b'
:
if
(
cx
>
0
)
cx
--
;
break
;
case
7
:
/* Bell */
break
;
case
'\t'
:
for
(
i
=
0
;
i
<
10
;
i
++
)
{
if
(
tabs
[
i
]
>
cx
)
{
while
(
cx
<
tabs
[
i
])
{
cx
++
;
}
break
;
}
}
if
(
i
==
10
)
{
cx
=
1
;
if
(
cy
==
cterm
.
height
)
{
*
p
=
0
;
cputs
(
outp
);
outp
=
p
+
1
;
scrollup
();
}
else
cy
++
;
}
break
;
default:
if
(
cy
==
cterm
.
height
&&
cx
==
cterm
.
width
)
{
*
p
=
0
;
cputs
(
outp
);
outp
=
p
+
1
;
scrollup
();
cx
=
1
;
}
else
{
if
(
cx
==
cterm
.
width
)
{
cx
=
1
;
cy
++
;
}
else
{
cx
++
;
}
}
break
;
}
}
cputs
(
outp
);
_wscroll
=
oldscroll
;
}
char
*
cterm_write
(
unsigned
char
*
buf
,
int
buflen
,
char
*
retbuf
,
int
retsize
)
char
*
cterm_write
(
unsigned
char
*
buf
,
int
buflen
,
char
*
retbuf
,
int
retsize
)
{
{
unsigned
char
ch
[
2
];
unsigned
char
ch
[
2
];
...
@@ -532,9 +595,9 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
...
@@ -532,9 +595,9 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
if
(
retbuf
!=
NULL
)
if
(
retbuf
!=
NULL
)
retbuf
[
0
]
=
0
;
retbuf
[
0
]
=
0
;
gettextinfo
(
&
ti
);
gettextinfo
(
&
ti
);
window
(
term
.
x
,
term
.
y
,
term
.
x
+
term
.
width
-
1
,
term
.
y
+
term
.
height
-
1
);
window
(
c
term
.
x
,
c
term
.
y
,
c
term
.
x
+
c
term
.
width
-
1
,
c
term
.
y
+
c
term
.
height
-
1
);
gotoxy
(
term
.
xpos
,
term
.
ypos
);
gotoxy
(
c
term
.
xpos
,
c
term
.
ypos
);
textattr
(
term
.
attr
);
textattr
(
c
term
.
attr
);
ch
[
1
]
=
0
;
ch
[
1
]
=
0
;
switch
(
buflen
)
{
switch
(
buflen
)
{
case
0
:
case
0
:
...
@@ -543,15 +606,15 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
...
@@ -543,15 +606,15 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
prn
[
0
]
=
0
;
prn
[
0
]
=
0
;
for
(
j
=
0
;
j
<
buflen
;
j
++
)
{
for
(
j
=
0
;
j
<
buflen
;
j
++
)
{
ch
[
0
]
=
buf
[
j
];
ch
[
0
]
=
buf
[
j
];
if
(
term
.
sequence
)
{
if
(
c
term
.
sequence
)
{
strcat
(
term
.
escbuf
,
ch
);
strcat
(
c
term
.
escbuf
,
ch
);
if
((
ch
[
0
]
>=
'@'
&&
ch
[
0
]
<=
'Z'
)
if
((
ch
[
0
]
>=
'@'
&&
ch
[
0
]
<=
'Z'
)
||
(
ch
[
0
]
>=
'a'
&&
ch
[
0
]
<=
'z'
))
{
||
(
ch
[
0
]
>=
'a'
&&
ch
[
0
]
<=
'z'
))
{
do_ansi
(
retbuf
,
retsize
);
do_ansi
(
retbuf
,
retsize
);
}
}
}
}
else
if
(
term
.
music
)
{
else
if
(
c
term
.
music
)
{
strcat
(
term
.
musicbuf
,
ch
);
strcat
(
c
term
.
musicbuf
,
ch
);
if
(
ch
[
0
]
==
14
)
if
(
ch
[
0
]
==
14
)
play_music
();
play_music
();
}
}
...
@@ -560,7 +623,7 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
...
@@ -560,7 +623,7 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
case
0
:
case
0
:
break
;
break
;
case
7
:
/* Beep */
case
7
:
/* Beep */
cputs
(
prn
);
c
t
puts
(
prn
);
prn
[
0
]
=
0
;
prn
[
0
]
=
0
;
#ifdef __unix__
#ifdef __unix__
putch
(
7
);
putch
(
7
);
...
@@ -569,18 +632,18 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
...
@@ -569,18 +632,18 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
#endif
#endif
break
;
break
;
case
12
:
/* ^L - Clear screen */
case
12
:
/* ^L - Clear screen */
cputs
(
prn
);
c
t
puts
(
prn
);
prn
[
0
]
=
0
;
prn
[
0
]
=
0
;
clearscreen
(
term
.
attr
);
clearscreen
(
c
term
.
attr
);
gotoxy
(
1
,
1
);
gotoxy
(
1
,
1
);
break
;
break
;
case
27
:
/* ESC */
case
27
:
/* ESC */
cputs
(
prn
);
c
t
puts
(
prn
);
prn
[
0
]
=
0
;
prn
[
0
]
=
0
;
term
.
sequence
=
1
;
c
term
.
sequence
=
1
;
break
;
break
;
case
'\t'
:
case
'\t'
:
cputs
(
prn
);
c
t
puts
(
prn
);
prn
[
0
]
=
0
;
prn
[
0
]
=
0
;
for
(
k
=
0
;
k
<
11
;
k
++
)
{
for
(
k
=
0
;
k
<
11
;
k
++
)
{
if
(
tabs
[
k
]
>
wherex
())
{
if
(
tabs
[
k
]
>
wherex
())
{
...
@@ -594,12 +657,12 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
...
@@ -594,12 +657,12 @@ char *cterm_write(unsigned char *buf, int buflen, char *retbuf, int retsize)
}
}
}
}
}
}
cputs
(
prn
);
c
t
puts
(
prn
);
prn
[
0
]
=
0
;
prn
[
0
]
=
0
;
break
;
break
;
}
}
term
.
xpos
=
wherex
();
c
term
.
xpos
=
wherex
();
term
.
ypos
=
wherey
();
c
term
.
ypos
=
wherey
();
#if 0
#if 0
window(ti.winleft,ti.wintop,ti.winright,ti.wintop);
window(ti.winleft,ti.wintop,ti.winright,ti.wintop);
gotoxy(ti.curx,ti.cury);
gotoxy(ti.curx,ti.cury);
...
...
This diff is collapsed.
Click to expand it.
src/conio/cterm.h
+
23
−
0
View file @
dad57367
#ifndef _CTERM_H_
#ifndef _CTERM_H_
#define _CTERM_H_
#define _CTERM_H_
struct
cterminal
{
int
height
;
int
width
;
int
x
;
int
y
;
char
*
buffer
;
int
attr
;
int
save_xpos
;
int
save_ypos
;
char
escbuf
[
1024
];
int
sequence
;
char
musicbuf
[
1024
];
int
music
;
char
*
scrollback
;
int
backpos
;
int
backlines
;
int
xpos
;
int
ypos
;
};
#ifdef __cplusplus
#ifdef __cplusplus
extern
"C"
{
extern
"C"
{
#endif
#endif
extern
struct
cterminal
cterm
;
void
cterm_init
(
int
height
,
int
width
,
int
xpos
,
int
ypos
,
int
backlines
,
unsigned
char
*
scrollback
);
void
cterm_init
(
int
height
,
int
width
,
int
xpos
,
int
ypos
,
int
backlines
,
unsigned
char
*
scrollback
);
char
*
cterm_write
(
unsigned
char
*
buf
,
int
buflen
,
char
*
retbuf
,
int
retsize
);
char
*
cterm_write
(
unsigned
char
*
buf
,
int
buflen
,
char
*
retbuf
,
int
retsize
);
void
cterm_end
(
void
);
void
cterm_end
(
void
);
...
...
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment