Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
N
nuttx-apps
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Container Registry
Model registry
Operate
Environments
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
f4grx
nuttx-apps
Commits
9d49d396
Commit
9d49d396
authored
11 years ago
by
Gregory Nutt
Browse files
Options
Downloads
Patches
Plain Diff
Fix bugs in EMACS command line editor, primarily errors in the VT100 commands
parent
82d71bb4
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
system/cle/cle.c
+149
-137
149 additions, 137 deletions
system/cle/cle.c
with
149 additions
and
137 deletions
system/cle/cle.c
+
149
−
137
View file @
9d49d396
...
@@ -91,7 +91,7 @@
...
@@ -91,7 +91,7 @@
#undef CTRL
#undef CTRL
#define CTRL(a) ((a) & 0x1f)
#define CTRL(a) ((a) & 0x1f)
#define CLE_BEL(
cle)
cle_putch(
cle
,CTRL('G'))
#define CLE_BEL(
priv)
cle_putch(
priv
,CTRL('G'))
/* Sizes of things */
/* Sizes of things */
...
@@ -101,40 +101,35 @@
...
@@ -101,40 +101,35 @@
/* Debug */
/* Debug */
#ifndef CONFIG_SYSEM_CLE_DEBUGLEVEL
#ifndef CONFIG_SYS
T
EM_CLE_DEBUGLEVEL
# define CONFIG_SYSEM_CLE_DEBUGLEVEL 0
# define CONFIG_SYS
T
EM_CLE_DEBUGLEVEL 0
#endif
#endif
#ifdef CONFIG_CPP_HAVE_VARARGS
#ifdef CONFIG_CPP_HAVE_VARARGS
# if CONFIG_SYSEM_CLE_DEBUGLEVEL > 0
# if CONFIG_SYS
T
EM_CLE_DEBUGLEVEL > 0
# define
vi
dbg(format, arg...) \
# define
cle
dbg(format, arg...) \
syslog(EXTRA_FMT format EXTRA_ARG, ##arg)
syslog(EXTRA_FMT format EXTRA_ARG, ##arg)
# define vvidbg(format, ap) \
vsyslog(format, ap)
# else
# else
# define vidbg(x...)
# define cledbg(x...)
# define vvidbg(x...)
# endif
# endif
# if CONFIG_SYSEM_CLE_DEBUGLEVEL > 1
# if CONFIG_SYS
T
EM_CLE_DEBUGLEVEL > 1
# define
vi
vdbg(format, arg...) \
# define
cle
vdbg(format, arg...) \
syslog(EXTRA_FMT format EXTRA_ARG, ##arg)
syslog(EXTRA_FMT format EXTRA_ARG, ##arg)
# else
# else
# define
vi
vdbg(x...)
# define
cle
vdbg(x...)
# endif
# endif
#else
#else
# if CONFIG_SYSEM_CLE_DEBUGLEVEL > 0
# if CONFIG_SYSTEM_CLE_DEBUGLEVEL > 0
# define vidbg syslog
# define cledbg syslog
# define vvidbg vsyslog
# else
# else
# define vidbg (void)
# define cledbg (void)
# define vvidbg (void)
# endif
# endif
# if CONFIG_SYSEM_CLE_DEBUGLEVEL > 1
# if CONFIG_SYS
T
EM_CLE_DEBUGLEVEL > 1
# define
vi
vdbg syslog
# define
cle
vdbg syslog
# else
# else
# define
vi
vdbg (void)
# define
cle
vdbg (void)
# endif
# endif
#endif
#endif
...
@@ -162,7 +157,7 @@ struct cle_s
...
@@ -162,7 +157,7 @@ struct cle_s
{
{
uint16_t
curpos
;
/* Current cursor position */
uint16_t
curpos
;
/* Current cursor position */
uint16_t
cursave
;
/* Saved cursor position */
uint16_t
cursave
;
/* Saved cursor position */
uint16_t
row
;
/* This is the row that we are editing i
u
n */
uint16_t
row
;
/* This is the row that we are editing in */
uint16_t
coloffs
;
/* Left cursor offset */
uint16_t
coloffs
;
/* Left cursor offset */
uint16_t
linelen
;
/* Size of the line buffer */
uint16_t
linelen
;
/* Size of the line buffer */
uint16_t
nchars
;
/* Size of data in the line buffer */
uint16_t
nchars
;
/* Size of data in the line buffer */
...
@@ -177,25 +172,25 @@ struct cle_s
...
@@ -177,25 +172,25 @@ struct cle_s
/* Low-level display and data entry functions */
/* Low-level display and data entry functions */
static
void
cle_write
(
FAR
struct
cle_s
*
cle
,
FAR
const
char
*
buffer
,
static
void
cle_write
(
FAR
struct
cle_s
*
priv
,
FAR
const
char
*
buffer
,
uint16_t
buflen
);
uint16_t
buflen
);
static
void
cle_putch
(
FAR
struct
cle_s
*
cle
,
char
ch
);
static
void
cle_putch
(
FAR
struct
cle_s
*
priv
,
char
ch
);
static
int
cle_getch
(
FAR
struct
cle_s
*
cle
);
static
int
cle_getch
(
FAR
struct
cle_s
*
priv
);
static
void
cle_cursoron
(
FAR
struct
cle_s
*
cle
);
static
void
cle_cursoron
(
FAR
struct
cle_s
*
priv
);
static
void
cle_cursoroff
(
FAR
struct
cle_s
*
cle
);
static
void
cle_cursoroff
(
FAR
struct
cle_s
*
priv
);
static
void
cle_setcursor
(
FAR
struct
cle_s
*
cle
,
uint16_t
column
);
static
void
cle_setcursor
(
FAR
struct
cle_s
*
priv
,
uint16_t
column
);
static
int
cle_getcursor
(
FAR
struct
cle_s
*
cle
,
uint16_t
*
prow
,
static
int
cle_getcursor
(
FAR
struct
cle_s
*
priv
,
uint16_t
*
prow
,
uint16_t
*
pcolumn
);
uint16_t
*
pcolumn
);
static
void
cle_clrtoeol
(
FAR
struct
cle_s
*
cle
);
static
void
cle_clrtoeol
(
FAR
struct
cle_s
*
priv
);
/* Editor function */
/* Editor function */
static
bool
cle_opentext
(
FAR
struct
cle_s
*
cle
,
uint16_t
pos
,
static
bool
cle_opentext
(
FAR
struct
cle_s
*
priv
,
uint16_t
pos
,
uint16_t
increment
);
uint16_t
increment
);
static
void
cle_closetext
(
FAR
struct
cle_s
*
cle
,
uint16_t
pos
,
uint16_t
size
);
static
void
cle_closetext
(
FAR
struct
cle_s
*
priv
,
uint16_t
pos
,
uint16_t
size
);
static
void
cle_showtext
(
FAR
struct
cle_s
*
cle
);
static
void
cle_showtext
(
FAR
struct
cle_s
*
priv
);
static
void
cle_insertch
(
FAR
struct
cle_s
*
cle
,
char
ch
);
static
void
cle_insertch
(
FAR
struct
cle_s
*
priv
,
char
ch
);
static
int
cle_editloop
(
FAR
struct
cle_s
*
cle
);
static
int
cle_editloop
(
FAR
struct
cle_s
*
priv
);
/****************************************************************************
/****************************************************************************
* Private Data
* Private Data
...
@@ -218,10 +213,6 @@ static const char g_fmtnotvalid[] = "Command not valid";
...
@@ -218,10 +213,6 @@ static const char g_fmtnotvalid[] = "Command not valid";
* Private Functions
* Private Functions
****************************************************************************/
****************************************************************************/
/****************************************************************************
* Low-level display and data entry functions
****************************************************************************/
/****************************************************************************
/****************************************************************************
* Name: cle_write
* Name: cle_write
*
*
...
@@ -230,13 +221,13 @@ static const char g_fmtnotvalid[] = "Command not valid";
...
@@ -230,13 +221,13 @@ static const char g_fmtnotvalid[] = "Command not valid";
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_write
(
FAR
struct
cle_s
*
cle
,
FAR
const
char
*
buffer
,
static
void
cle_write
(
FAR
struct
cle_s
*
priv
,
FAR
const
char
*
buffer
,
uint16_t
buflen
)
uint16_t
buflen
)
{
{
ssize_t
nwritten
;
ssize_t
nwritten
;
uint16_t
nremaining
=
buflen
;
uint16_t
nremaining
=
buflen
;
//
vi
vdbg("buffer=%p buflen=%d\n", buffer, (int)buflen);
//
cle
vdbg("buffer=%p buflen=%d\n", buffer, (int)buflen);
/* Loop until all bytes have been successuflly written (or until a
/* Loop until all bytes have been successuflly written (or until a
* un-recoverable error is encountered)
* un-recoverable error is encountered)
...
@@ -246,7 +237,7 @@ static void cle_write(FAR struct cle_s *cle, FAR const char *buffer,
...
@@ -246,7 +237,7 @@ static void cle_write(FAR struct cle_s *cle, FAR const char *buffer,
{
{
/* Take the next gulp */
/* Take the next gulp */
nwritten
=
write
(
cle
->
outfd
,
buffer
,
buflen
);
nwritten
=
write
(
priv
->
outfd
,
buffer
,
buflen
);
/* Handle write errors. write() should neve return 0. */
/* Handle write errors. write() should neve return 0. */
...
@@ -259,7 +250,7 @@ static void cle_write(FAR struct cle_s *cle, FAR const char *buffer,
...
@@ -259,7 +250,7 @@ static void cle_write(FAR struct cle_s *cle, FAR const char *buffer,
int
errcode
=
errno
;
int
errcode
=
errno
;
if
(
nwritten
==
0
||
errcode
!=
EINTR
)
if
(
nwritten
==
0
||
errcode
!=
EINTR
)
{
{
vi
dbg
(
"ERROR: write to stdout failed: %d
\n
"
,
errcode
);
cle
dbg
(
"ERROR: write to stdout failed: %d
\n
"
,
errcode
);
return
;
return
;
}
}
}
}
...
@@ -284,9 +275,9 @@ static void cle_write(FAR struct cle_s *cle, FAR const char *buffer,
...
@@ -284,9 +275,9 @@ static void cle_write(FAR struct cle_s *cle, FAR const char *buffer,
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_putch
(
FAR
struct
cle_s
*
cle
,
char
ch
)
static
void
cle_putch
(
FAR
struct
cle_s
*
priv
,
char
ch
)
{
{
cle_write
(
cle
,
&
ch
,
1
);
cle_write
(
priv
,
&
ch
,
1
);
}
}
/****************************************************************************
/****************************************************************************
...
@@ -297,7 +288,7 @@ static void cle_putch(FAR struct cle_s *cle, char ch)
...
@@ -297,7 +288,7 @@ static void cle_putch(FAR struct cle_s *cle, char ch)
*
*
****************************************************************************/
****************************************************************************/
static
int
cle_getch
(
FAR
struct
cle_s
*
cle
)
static
int
cle_getch
(
FAR
struct
cle_s
*
priv
)
{
{
char
buffer
;
char
buffer
;
ssize_t
nread
;
ssize_t
nread
;
...
@@ -310,7 +301,7 @@ static int cle_getch(FAR struct cle_s *cle)
...
@@ -310,7 +301,7 @@ static int cle_getch(FAR struct cle_s *cle)
{
{
/* Read one character from the incoming stream */
/* Read one character from the incoming stream */
nread
=
read
(
cle
->
infd
,
&
buffer
,
1
);
nread
=
read
(
priv
->
infd
,
&
buffer
,
1
);
/* Check for error or end-of-file. */
/* Check for error or end-of-file. */
...
@@ -323,7 +314,7 @@ static int cle_getch(FAR struct cle_s *cle)
...
@@ -323,7 +314,7 @@ static int cle_getch(FAR struct cle_s *cle)
int
errcode
=
errno
;
int
errcode
=
errno
;
if
(
nread
==
0
||
errcode
!=
EINTR
)
if
(
nread
==
0
||
errcode
!=
EINTR
)
{
{
vi
dbg
(
"ERROR: read from stdin failed: %d
\n
"
,
errcode
);
cle
dbg
(
"ERROR: read from stdin failed: %d
\n
"
,
errcode
);
return
-
EIO
;
return
-
EIO
;
}
}
}
}
...
@@ -332,7 +323,7 @@ static int cle_getch(FAR struct cle_s *cle)
...
@@ -332,7 +323,7 @@ static int cle_getch(FAR struct cle_s *cle)
/* On success, return the character that was read */
/* On success, return the character that was read */
vi
vdbg
(
"Returning: %c[%02x]
\n
"
,
isprint
(
buffer
)
?
buffer
:
'.'
,
buffer
);
cle
vdbg
(
"Returning: %c[%02x]
\n
"
,
isprint
(
buffer
)
?
buffer
:
'.'
,
buffer
);
return
buffer
;
return
buffer
;
}
}
...
@@ -344,11 +335,11 @@ static int cle_getch(FAR struct cle_s *cle)
...
@@ -344,11 +335,11 @@ static int cle_getch(FAR struct cle_s *cle)
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_cursoron
(
FAR
struct
cle_s
*
cle
)
static
void
cle_cursoron
(
FAR
struct
cle_s
*
priv
)
{
{
/* Send the VT100 CURSORON command */
/* Send the VT100 CURSORON command */
cle_write
(
cle
,
g_cursoron
,
sizeof
(
g_cursoron
));
cle_write
(
priv
,
g_cursoron
,
sizeof
(
g_cursoron
));
}
}
/****************************************************************************
/****************************************************************************
...
@@ -359,11 +350,11 @@ static void cle_cursoron(FAR struct cle_s *cle)
...
@@ -359,11 +350,11 @@ static void cle_cursoron(FAR struct cle_s *cle)
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_cursoroff
(
FAR
struct
cle_s
*
cle
)
static
void
cle_cursoroff
(
FAR
struct
cle_s
*
priv
)
{
{
/* Send the VT100 CURSOROFF command */
/* Send the VT100 CURSOROFF command */
cle_write
(
cle
,
g_cursoroff
,
sizeof
(
g_cursoroff
));
cle_write
(
priv
,
g_cursoroff
,
sizeof
(
g_cursoroff
));
}
}
/****************************************************************************
/****************************************************************************
...
@@ -374,20 +365,20 @@ static void cle_cursoroff(FAR struct cle_s *cle)
...
@@ -374,20 +365,20 @@ static void cle_cursoroff(FAR struct cle_s *cle)
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_setcursor
(
FAR
struct
cle_s
*
cle
,
uint16_t
column
)
static
void
cle_setcursor
(
FAR
struct
cle_s
*
priv
,
uint16_t
column
)
{
{
char
buffer
[
16
];
char
buffer
[
16
];
int
len
;
int
len
;
vi
vdbg
(
"row=%d column=%d
\n
"
,
row
,
column
);
cle
vdbg
(
"row=%d column=%d
offset=%d
\n
"
,
priv
->
row
,
column
,
priv
->
coloffs
);
/* Format the cursor position command. The origin is (1,1). */
/* Format the cursor position command. The origin is (1,1). */
len
=
snprintf
(
buffer
,
16
,
g_fmtcursorpos
,
cle
->
row
,
column
+
cle
->
coloffs
);
len
=
snprintf
(
buffer
,
16
,
g_fmtcursorpos
,
priv
->
row
,
column
+
priv
->
coloffs
);
/* Send the VT100 CURSORPOS command */
/* Send the VT100 CURSORPOS command */
cle_write
(
cle
,
buffer
,
len
);
cle_write
(
priv
,
buffer
,
len
);
}
}
/****************************************************************************
/****************************************************************************
...
@@ -398,7 +389,7 @@ static void cle_setcursor(FAR struct cle_s *cle, uint16_t column)
...
@@ -398,7 +389,7 @@ static void cle_setcursor(FAR struct cle_s *cle, uint16_t column)
*
*
****************************************************************************/
****************************************************************************/
static
int
cle_getcursor
(
FAR
struct
cle_s
*
cle
,
FAR
uint16_t
*
prow
,
static
int
cle_getcursor
(
FAR
struct
cle_s
*
priv
,
FAR
uint16_t
*
prow
,
FAR
uint16_t
*
pcolumn
)
FAR
uint16_t
*
pcolumn
)
{
{
uint32_t
row
;
uint32_t
row
;
...
@@ -408,16 +399,16 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
...
@@ -408,16 +399,16 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
/* Send the VT100 GETCURSOR command */
/* Send the VT100 GETCURSOR command */
cle_write
(
cle
,
g_getcursor
,
sizeof
(
g_getcursor
));
cle_write
(
priv
,
g_getcursor
,
sizeof
(
g_getcursor
));
/* We expect to get ESCv;hR where v is the row and h is the column */
/* We expect to get ESC
[
v;hR where v is the row and h is the column */
nbad
=
0
;
nbad
=
0
;
for
(;;)
for
(;;)
{
{
/* Get the next character from the input */
/* Get the next character from the input */
ch
=
cle_getch
(
cle
);
ch
=
cle_getch
(
priv
);
if
(
ch
==
ASCII_ESC
)
if
(
ch
==
ASCII_ESC
)
{
{
break
;
break
;
...
@@ -434,14 +425,38 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
...
@@ -434,14 +425,38 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
}
}
}
}
/* Now we expect to see a numeric value terminated with ';' */
/* Have ESC, now we expect '[' */
nbad
=
0
;
for
(;;)
{
/* Get the next character from the input */
ch
=
cle_getch
(
priv
);
if
(
ch
==
'['
)
{
break
;
}
else
if
(
ch
<
0
)
{
return
-
EIO
;
}
else
{
/* We are probably talking to a non-VT100 terminal! */
return
-
EINVAL
;
}
}
/* Have ESC'['. Now we expect to see a numeric value terminated with ';' */
row
=
0
;
row
=
0
;
for
(;;)
for
(;;)
{
{
/* Get the next character from the input */
/* Get the next character from the input */
ch
=
cle_getch
(
cle
);
ch
=
cle_getch
(
priv
);
if
(
isdigit
(
ch
))
if
(
isdigit
(
ch
))
{
{
row
=
10
*
row
+
(
ch
-
'0'
);
row
=
10
*
row
+
(
ch
-
'0'
);
...
@@ -460,14 +475,14 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
...
@@ -460,14 +475,14 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
}
}
}
}
/* Now we expect to see another numeric value terminated with 'R' */
/*
Have ESC'['v';'.
Now we expect to see another numeric value terminated with 'R' */
column
=
0
;
column
=
0
;
for
(;;)
for
(;;)
{
{
/* Get the next character from the input */
/* Get the next character from the input */
ch
=
cle_getch
(
cle
);
ch
=
cle_getch
(
priv
);
if
(
isdigit
(
ch
))
if
(
isdigit
(
ch
))
{
{
column
=
10
*
column
+
(
ch
-
'0'
);
column
=
10
*
column
+
(
ch
-
'0'
);
...
@@ -486,7 +501,7 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
...
@@ -486,7 +501,7 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
}
}
}
}
vi
vdbg
(
"row=%ld column=%ld
\n
"
,
row
,
column
);
cle
vdbg
(
"row=%ld column=%ld
\n
"
,
row
,
column
);
/* Make sure that the values are within range */
/* Make sure that the values are within range */
...
@@ -509,11 +524,11 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
...
@@ -509,11 +524,11 @@ static int cle_getcursor(FAR struct cle_s *cle, FAR uint16_t *prow,
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_clrtoeol
(
FAR
struct
cle_s
*
cle
)
static
void
cle_clrtoeol
(
FAR
struct
cle_s
*
priv
)
{
{
/* Send the VT100 ERASETOEOL command */
/* Send the VT100 ERASETOEOL command */
cle_write
(
cle
,
g_erasetoeol
,
sizeof
(
g_erasetoeol
));
cle_write
(
priv
,
g_erasetoeol
,
sizeof
(
g_erasetoeol
));
}
}
/****************************************************************************
/****************************************************************************
...
@@ -525,17 +540,17 @@ static void cle_clrtoeol(FAR struct cle_s *cle)
...
@@ -525,17 +540,17 @@ static void cle_clrtoeol(FAR struct cle_s *cle)
*
*
****************************************************************************/
****************************************************************************/
static
bool
cle_opentext
(
FAR
struct
cle_s
*
cle
,
uint16_t
pos
,
uint16_t
increment
)
static
bool
cle_opentext
(
FAR
struct
cle_s
*
priv
,
uint16_t
pos
,
uint16_t
increment
)
{
{
int
i
;
int
i
;
vi
vdbg
(
"pos=%ld increment=%ld
\n
"
,
(
long
)
pos
,
(
long
)
increment
);
cle
vdbg
(
"pos=%ld increment=%ld
\n
"
,
(
long
)
pos
,
(
long
)
increment
);
/* Check if there is space in the line buffer to open up a region the size
/* Check if there is space in the line buffer to open up a region the size
* of 'increment'
* of 'increment'
*/
*/
if
(
cle
->
nchars
+
increment
>
cle
->
linelen
)
if
(
priv
->
nchars
+
increment
>
priv
->
linelen
)
{
{
return
false
;
return
false
;
}
}
...
@@ -544,14 +559,14 @@ static bool cle_opentext(FAR struct cle_s *cle, uint16_t pos, uint16_t increment
...
@@ -544,14 +559,14 @@ static bool cle_opentext(FAR struct cle_s *cle, uint16_t pos, uint16_t increment
* cursor position
* cursor position
*/
*/
for
(
i
=
cle
->
nchars
-
1
;
i
>=
pos
;
i
--
)
for
(
i
=
priv
->
nchars
-
1
;
i
>=
pos
;
i
--
)
{
{
cle
->
line
[
i
+
increment
]
=
cle
->
line
[
i
];
priv
->
line
[
i
+
increment
]
=
priv
->
line
[
i
];
}
}
/* Adjust end of file position */
/* Adjust end of file position */
cle
->
nchars
+=
increment
;
priv
->
nchars
+=
increment
;
return
true
;
return
true
;
}
}
...
@@ -564,39 +579,39 @@ static bool cle_opentext(FAR struct cle_s *cle, uint16_t pos, uint16_t increment
...
@@ -564,39 +579,39 @@ static bool cle_opentext(FAR struct cle_s *cle, uint16_t pos, uint16_t increment
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_closetext
(
FAR
struct
cle_s
*
cle
,
uint16_t
pos
,
uint16_t
size
)
static
void
cle_closetext
(
FAR
struct
cle_s
*
priv
,
uint16_t
pos
,
uint16_t
size
)
{
{
int
i
;
int
i
;
vi
vdbg
(
"pos=%ld size=%ld
\n
"
,
(
long
)
pos
,
(
long
)
size
);
cle
vdbg
(
"pos=%ld size=%ld
\n
"
,
(
long
)
pos
,
(
long
)
size
);
/* Close up the gap to remove 'size' characters at 'pos' */
/* Close up the gap to remove 'size' characters at 'pos' */
for
(
i
=
pos
+
size
;
i
<
cle
->
nchars
;
i
++
)
for
(
i
=
pos
+
size
;
i
<
priv
->
nchars
;
i
++
)
{
{
cle
->
line
[
i
-
size
]
=
cle
->
line
[
i
];
priv
->
line
[
i
-
size
]
=
priv
->
line
[
i
];
}
}
/* Adjust sizes and positions */
/* Adjust sizes and positions */
cle
->
nchars
-=
size
;
priv
->
nchars
-=
size
;
/* Check if the cursor position is beyond the deleted region */
/* Check if the cursor position is beyond the deleted region */
if
(
cle
->
curpos
>
pos
+
size
)
if
(
priv
->
curpos
>
pos
+
size
)
{
{
/* Yes... just subtract the size of the deleted region */
/* Yes... just subtract the size of the deleted region */
cle
->
curpos
-=
size
;
priv
->
curpos
-=
size
;
}
}
/* What if the position is within the deleted region? Set it to the
/* What if the position is within the deleted region? Set it to the
* beginning of the deleted region.
* beginning of the deleted region.
*/
*/
else
if
(
cle
->
curpos
>
pos
)
else
if
(
priv
->
curpos
>
pos
)
{
{
cle
->
curpos
=
pos
;
priv
->
curpos
=
pos
;
}
}
}
}
...
@@ -610,34 +625,34 @@ static void cle_closetext(FAR struct cle_s *cle, uint16_t pos, uint16_t size)
...
@@ -610,34 +625,34 @@ static void cle_closetext(FAR struct cle_s *cle, uint16_t pos, uint16_t size)
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_showtext
(
FAR
struct
cle_s
*
cle
)
static
void
cle_showtext
(
FAR
struct
cle_s
*
priv
)
{
{
uint16_t
column
;
uint16_t
column
;
uint16_t
tabcol
;
uint16_t
tabcol
;
/* Turn off the cursor during the update. */
/* Turn off the cursor during the update. */
cle_cursoroff
(
cle
);
cle_cursoroff
(
priv
);
/* Set the cursor position to the beginning of this row */
/* Set the cursor position to the beginning of this row */
cle_setcursor
(
cle
,
0
);
cle_setcursor
(
priv
,
0
);
cle_clrtoeol
(
cle
);
cle_clrtoeol
(
priv
);
/* Loop for each column */
/* Loop for each column */
for
(
column
=
0
;
column
<
cle
->
nchars
&&
column
<
cle
->
linelen
;
column
++
)
for
(
column
=
0
;
column
<
priv
->
nchars
&&
column
<
priv
->
linelen
;
)
{
{
/* Perform TAB expansion */
/* Perform TAB expansion */
if
(
cle
->
line
[
column
]
==
'\t'
)
if
(
priv
->
line
[
column
]
==
'\t'
)
{
{
tabcol
=
NEXT_TAB
(
column
);
tabcol
=
NEXT_TAB
(
column
);
if
(
tabcol
<
cle
->
linelen
)
if
(
tabcol
<
priv
->
linelen
)
{
{
for
(;
column
<
tabcol
;
column
++
)
for
(;
column
<
tabcol
;
column
++
)
{
{
cle_putch
(
cle
,
' '
);
cle_putch
(
priv
,
' '
);
}
}
}
}
else
else
...
@@ -654,14 +669,14 @@ static void cle_showtext(FAR struct cle_s *cle)
...
@@ -654,14 +669,14 @@ static void cle_showtext(FAR struct cle_s *cle)
else
else
{
{
cle_putch
(
cle
,
cle
->
line
[
column
]);
cle_putch
(
priv
,
priv
->
line
[
column
]);
column
++
;
column
++
;
}
}
}
}
/* Turn the cursor back on */
/* Turn the cursor back on */
cle_cursoron
(
cle
);
cle_cursoron
(
priv
);
}
}
/****************************************************************************
/****************************************************************************
...
@@ -672,17 +687,17 @@ static void cle_showtext(FAR struct cle_s *cle)
...
@@ -672,17 +687,17 @@ static void cle_showtext(FAR struct cle_s *cle)
*
*
****************************************************************************/
****************************************************************************/
static
void
cle_insertch
(
FAR
struct
cle_s
*
cle
,
char
ch
)
static
void
cle_insertch
(
FAR
struct
cle_s
*
priv
,
char
ch
)
{
{
vi
vdbg
(
"curpos=%ld ch=%c[%02x]
\n
"
,
cle
->
curpos
,
isprint
(
ch
)
?
ch
:
'.'
,
ch
);
cle
vdbg
(
"curpos=%ld ch=%c[%02x]
\n
"
,
priv
->
curpos
,
isprint
(
ch
)
?
ch
:
'.'
,
ch
);
/* Make space in the buffer for the new character */
/* Make space in the buffer for the new character */
if
(
cle_opentext
(
cle
,
cle
->
curpos
,
1
))
if
(
cle_opentext
(
priv
,
priv
->
curpos
,
1
))
{
{
/* Add the new character to the buffer */
/* Add the new character to the buffer */
cle
->
line
[
cle
->
curpos
++
]
=
ch
;
priv
->
line
[
priv
->
curpos
++
]
=
ch
;
}
}
}
}
...
@@ -694,7 +709,7 @@ static void cle_insertch(FAR struct cle_s *cle, char ch)
...
@@ -694,7 +709,7 @@ static void cle_insertch(FAR struct cle_s *cle, char ch)
*
*
****************************************************************************/
****************************************************************************/
static
int
cle_editloop
(
FAR
struct
cle_s
*
cle
)
static
int
cle_editloop
(
FAR
struct
cle_s
*
priv
)
{
{
/* Loop while we are in command mode */
/* Loop while we are in command mode */
...
@@ -704,12 +719,12 @@ static int cle_editloop(FAR struct cle_s *cle)
...
@@ -704,12 +719,12 @@ static int cle_editloop(FAR struct cle_s *cle)
/* Make sure that the display reflects the current state */
/* Make sure that the display reflects the current state */
cle_showtext
(
cle
);
cle_showtext
(
priv
);
cle_setcursor
(
cle
,
cle
->
curpos
);
cle_setcursor
(
priv
,
priv
->
curpos
);
/* Get the next character from the input */
/* Get the next character from the input */
ch
=
cle_getch
(
cle
);
ch
=
cle_getch
(
priv
);
if
(
ch
<
0
)
if
(
ch
<
0
)
{
{
return
-
EIO
;
return
-
EIO
;
...
@@ -721,19 +736,19 @@ static int cle_editloop(FAR struct cle_s *cle)
...
@@ -721,19 +736,19 @@ static int cle_editloop(FAR struct cle_s *cle)
{
{
case
KEY_BEGINLINE
:
/* Move cursor to start of current line */
case
KEY_BEGINLINE
:
/* Move cursor to start of current line */
{
{
cle
->
curpos
=
0
;
priv
->
curpos
=
0
;
}
}
break
;
break
;
case
KEY_LEFT
:
/* Move the cursor left 1 character */
case
KEY_LEFT
:
/* Move the cursor left 1 character */
{
{
if
(
cle
->
curpos
>
0
)
if
(
priv
->
curpos
>
0
)
{
{
cle
->
curpos
--
;
priv
->
curpos
--
;
}
}
else
else
{
{
CLE_BEL
(
cle
);
CLE_BEL
(
priv
);
}
}
}
}
break
;
break
;
...
@@ -741,39 +756,32 @@ static int cle_editloop(FAR struct cle_s *cle)
...
@@ -741,39 +756,32 @@ static int cle_editloop(FAR struct cle_s *cle)
case
KEY_DEL
:
/* Delete 1 character at the cursor */
case
KEY_DEL
:
/* Delete 1 character at the cursor */
case
ASCII_DEL
:
case
ASCII_DEL
:
{
{
if
(
cle
->
curpos
<
cle
->
nchars
)
if
(
priv
->
curpos
<
priv
->
nchars
)
{
{
cle_closetext
(
cle
,
cle
->
curpos
,
1
);
cle_closetext
(
priv
,
priv
->
curpos
,
1
);
}
}
else
else
{
{
CLE_BEL
(
cle
);
CLE_BEL
(
priv
);
}
}
}
}
break
;
break
;
case
KEY_ENDLINE
:
/* Move cursor to end of current line */
case
KEY_ENDLINE
:
/* Move cursor to end of current line */
{
{
if
(
cle
->
nchars
>
0
)
priv
->
curpos
=
priv
->
nchars
;
{
cle
->
curpos
=
cle
->
nchars
-
1
;
}
else
{
CLE_BEL
(
cle
);
}
}
}
break
;
break
;
case
KEY_RIGHT
:
/* Move the cursor right one character */
case
KEY_RIGHT
:
/* Move the cursor right one character */
{
{
if
(
cle
->
curpos
<
cle
->
nchars
)
if
(
priv
->
curpos
<
priv
->
nchars
)
{
{
cle
->
curpos
++
;
priv
->
curpos
++
;
}
}
else
else
{
{
CLE_BEL
(
cle
);
CLE_BEL
(
priv
);
}
}
}
}
break
;
break
;
...
@@ -781,33 +789,33 @@ static int cle_editloop(FAR struct cle_s *cle)
...
@@ -781,33 +789,33 @@ static int cle_editloop(FAR struct cle_s *cle)
case
KEY_DELLEFT
:
/* Delete 1 character before the cursor */
case
KEY_DELLEFT
:
/* Delete 1 character before the cursor */
//case ASCII_BS:
//case ASCII_BS:
{
{
if
(
cle
->
curpos
>
0
)
if
(
priv
->
curpos
>
0
)
{
{
cle_closetext
(
cle
,
--
cle
->
curpos
,
1
);
cle_closetext
(
priv
,
--
priv
->
curpos
,
1
);
}
}
else
else
{
{
CLE_BEL
(
cle
);
CLE_BEL
(
priv
);
}
}
}
}
break
;
break
;
case
KEY_DELEOL
:
/* Delete to the end of the line */
case
KEY_DELEOL
:
/* Delete to the end of the line */
{
{
cle
->
nchars
=
(
cle
->
nchars
>
0
?
cle
->
curpos
+
1
:
0
);
priv
->
nchars
=
(
priv
->
nchars
>
0
?
priv
->
curpos
+
1
:
0
);
}
}
break
;
break
;
case
KEY_DELLINE
:
/* Delete to the end of the line */
case
KEY_DELLINE
:
/* Delete to the end of the line */
{
{
cle
->
nchars
=
0
;
priv
->
nchars
=
0
;
cle
->
curpos
=
0
;
priv
->
curpos
=
0
;
}
}
break
;
break
;
case
KEY_QUOTE
:
/* Quoted character follows */
case
KEY_QUOTE
:
/* Quoted character follows */
{
{
ch
=
cle_getch
(
cle
);
ch
=
cle_getch
(
priv
);
if
(
ch
<
0
)
if
(
ch
<
0
)
{
{
return
-
EIO
;
return
-
EIO
;
...
@@ -815,7 +823,7 @@ static int cle_editloop(FAR struct cle_s *cle)
...
@@ -815,7 +823,7 @@ static int cle_editloop(FAR struct cle_s *cle)
/* Insert the next character unconditionally */
/* Insert the next character unconditionally */
cle_insertch
(
cle
,
ch
);
cle_insertch
(
priv
,
ch
);
}
}
break
;
break
;
...
@@ -859,11 +867,11 @@ static int cle_editloop(FAR struct cle_s *cle)
...
@@ -859,11 +867,11 @@ static int cle_editloop(FAR struct cle_s *cle)
{
{
/* Insert the filtered character into the buffer */
/* Insert the filtered character into the buffer */
cle_insertch
(
cle
,
ch
);
cle_insertch
(
priv
,
ch
);
}
}
else
else
{
{
CLE_BEL
(
cle
);
CLE_BEL
(
priv
);
}
}
}
}
break
;
break
;
...
@@ -892,23 +900,25 @@ static int cle_editloop(FAR struct cle_s *cle)
...
@@ -892,23 +900,25 @@ static int cle_editloop(FAR struct cle_s *cle)
int
cle
(
FAR
char
*
line
,
uint16_t
linelen
,
FILE
*
instream
,
FILE
*
outstream
)
int
cle
(
FAR
char
*
line
,
uint16_t
linelen
,
FILE
*
instream
,
FILE
*
outstream
)
{
{
FAR
struct
cle_s
cle
;
FAR
struct
cle_s
priv
;
uint16_t
column
;
uint16_t
column
;
int
ret
;
int
ret
;
/* Initialize the cle state structure */
/* Initialize the CLE state structure */
memset
(
&
priv
,
0
,
sizeof
(
struct
cle_s
));
cle
.
linelen
=
linelen
;
priv
.
linelen
=
linelen
;
cle
.
line
=
line
;
priv
.
line
=
line
;
/* REVISIT: Non-standard, non-portable */
/* REVISIT: Non-standard, non-portable */
cle
.
infd
=
instream
->
fs_fd
;
priv
.
infd
=
instream
->
fs_fd
;
cle
.
outfd
=
outstream
->
fs_fd
;
priv
.
outfd
=
outstream
->
fs_fd
;
/* Get the current cursor position */
/* Get the current cursor position */
ret
=
cle_getcursor
(
&
cle
,
&
cle
.
row
,
&
column
);
ret
=
cle_getcursor
(
&
priv
,
&
priv
.
row
,
&
column
);
if
(
ret
<
0
)
if
(
ret
<
0
)
{
{
return
ret
;
return
ret
;
...
@@ -921,9 +931,11 @@ int cle(FAR char *line, uint16_t linelen, FILE *instream, FILE *outstream)
...
@@ -921,9 +931,11 @@ int cle(FAR char *line, uint16_t linelen, FILE *instream, FILE *outstream)
return
-
EINVAL
;
return
-
EINVAL
;
}
}
cle
.
coloffs
=
column
-
1
;
priv
.
coloffs
=
column
-
1
;
clevdbg
(
"row=%d column=%d
\n
"
,
priv
.
row
,
column
);
/* The editor loop */
/* The editor loop */
return
cle_editloop
(
&
cle
);
return
cle_editloop
(
&
priv
);
}
}
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