Skip to content
Toggle navigation
Toggle navigation
This project
Loading...
Sign in
John McEleney
/
mailutils
Go to a project
Toggle navigation
Toggle navigation pinning
Projects
Groups
Snippets
Help
Project
Activity
Repository
Pipelines
Graphs
Issues
0
Merge Requests
0
Wiki
Network
Create a new issue
Builds
Commits
Issue Boards
Files
Commits
Network
Compare
Branches
Tags
Commit
976ba811
...
976ba811a8df6c0befb1052c47910130c173d0fb
authored
2000-09-03 00:02:26 +0000
by
Jakob Kaivo
Browse Files
Options
Browse Files
Tag
Download
Email Patches
Plain Diff
readline tab completion for mail
1 parent
7eb89932
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
119 additions
and
40 deletions
mail/help.c
mail/mail.c
mail/mail.h
mail/table.h
mail/util.c
mail/help.c
View file @
976ba81
...
...
@@ -35,35 +35,19 @@ mail_help (int argc, char **argv)
}
else
{
int
status
=
0
;
int
command
=
0
;
while
(
++
command
<
argc
)
int
status
=
0
,
cmd
=
0
;
while
(
++
cmd
<
argc
)
{
char
*
cmd
=
argv
[
command
];
int
i
=
0
,
printed
=
0
,
sl
=
0
,
ll
=
0
,
len
=
strlen
(
cmd
);
while
(
mail_command_table
[
i
].
shortname
!=
0
&&
printed
==
0
)
struct
mail_command_entry
entry
=
util_find_entry
(
argv
[
cmd
]);
if
(
entry
.
synopsis
!=
NULL
)
printf
(
"%s
\n
"
,
entry
.
synopsis
);
else
{
sl
=
strlen
(
mail_command_table
[
i
].
shortname
);
ll
=
strlen
(
mail_command_table
[
i
].
longname
);
if
(
sl
==
len
&&
!
strcmp
(
mail_command_table
[
i
].
shortname
,
cmd
))
{
printed
=
1
;
printf
(
"%s
\n
"
,
mail_command_table
[
i
].
synopsis
);
}
else
if
(
sl
<
len
&&
!
strncmp
(
mail_command_table
[
i
].
longname
,
cmd
,
len
))
{
printed
=
1
;
printf
(
"%s
\n
"
,
mail_command_table
[
i
].
synopsis
);
}
i
++
;
}
if
(
printed
==
0
)
{
printf
(
"Unknown command: %s
\n
"
,
cmd
);
status
=
1
;
printf
(
"Unknown command: %s
\n
"
,
argv
[
cmd
]);
}
}
return
status
;
}
return
1
;
}
...
...
mail/mail.c
View file @
976ba81
...
...
@@ -113,7 +113,7 @@ static struct argp argp = { options, parse_opt, args_doc, doc };
int
main
(
int
argc
,
char
**
argv
)
{
char
*
command
=
NULL
;
char
*
command
=
NULL
,
*
cmd
=
NULL
;
char
*
from
[]
=
{
"from"
,
"*"
};
struct
arguments
args
;
...
...
@@ -163,12 +163,32 @@ main (int argc, char **argv)
mail_from
(
1
,
from
);
cursor
=
realcursor
;
/* Initialize readline */
rl_readline_name
=
"mail"
;
rl_attempted_completion_function
=
(
CPPFunction
*
)
util_command_completion
;
while
(
1
)
{
int
len
;
free
(
command
);
command
=
readline
(
"? "
);
util_do_command
(
command
);
add_history
(
command
);
len
=
strlen
(
command
);
while
(
command
[
len
-
1
]
==
'\\'
)
{
char
*
buf
;
char
*
command2
=
readline
(
"> "
);
command
[
len
-
1
]
=
'\0'
;
buf
=
malloc
((
len
+
strlen
(
command2
))
*
sizeof
(
char
));
strcpy
(
buf
,
command
);
strcat
(
buf
,
command2
);
free
(
command
);
command
=
buf
;
len
=
strlen
(
command
);
}
cmd
=
util_stripwhite
(
command
);
util_do_command
(
cmd
);
add_history
(
cmd
);
}
}
...
...
mail/mail.h
View file @
976ba81
...
...
@@ -110,8 +110,11 @@ int util_get_argcv __P((const char *command, int *argc, char ***argv));
int
util_expand_msglist
__P
((
const
int
argc
,
char
**
argv
,
int
**
list
));
int
util_do_command
__P
((
const
char
*
cmd
));
int
util_msglist_command
__P
((
int
(
*
func
)(
int
,
char
**
),
int
argc
,
char
**
argv
));
int
*
util_command_get
__P
((
char
*
cmd
));
Function
*
util_command_get
__P
((
char
*
cmd
));
int
util_free_argv
__P
((
int
argc
,
char
**
argv
));
char
**
util_command_completion
__P
((
char
*
cmd
,
int
start
,
int
end
));
char
*
util_command_generator
__P
((
char
*
text
,
int
state
));
char
*
util_stripwhite
__P
((
char
*
string
));
#ifdef __cplusplus
}
...
...
mail/table.h
View file @
976ba81
...
...
@@ -35,10 +35,12 @@ extern "C" {
struct
mail_command_entry
{
char
*
shortname
;
char
*
longname
;
int
(
*
func
)
__P
((
int
,
char
**
))
;
Function
*
func
;
char
*
synopsis
;
};
struct
mail_command_entry
util_find_entry
__P
((
char
*
cmd
));
static
struct
mail_command_entry
mail_command_table
[]
=
{
{
"a"
,
"alias"
,
mail_alias
,
"a[lias] [alias [address...]]"
},
...
...
mail/util.c
View file @
976ba81
...
...
@@ -166,15 +166,19 @@ util_do_command (const char *cmd)
int
argc
=
0
;
char
**
argv
=
NULL
;
int
status
=
0
;
int
(
*
command
)
(
int
,
char
**
)
=
NULL
;
Function
*
command
;
if
(
cmd
[
0
]
==
'#'
)
return
0
;
if
(
util_get_argcv
(
cmd
,
&
argc
,
&
argv
)
!=
0
)
return
util_free_argv
(
argc
,
argv
);
command
=
util_command_get
(
argv
[
0
]);
if
(
cmd
)
{
if
(
util_get_argcv
(
cmd
,
&
argc
,
&
argv
)
!=
0
)
return
util_free_argv
(
argc
,
argv
);
command
=
util_command_get
(
argv
[
0
]);
}
else
command
=
util_command_get
(
"quit"
);
if
(
command
!=
NULL
)
status
=
command
(
argc
,
argv
);
...
...
@@ -218,23 +222,89 @@ util_msglist_command (int (*func)(int, char**), int argc, char **argv)
/*
* returns the function to run for command
*/
int
*
Function
*
util_command_get
(
char
*
cmd
)
{
int
i
=
0
;
struct
mail_command_entry
entry
=
util_find_entry
(
cmd
);
return
entry
.
func
;
}
/*
* returns the mail_command_entry structure for the command matching cmd
*/
struct
mail_command_entry
util_find_entry
(
char
*
cmd
)
{
int
i
=
0
,
ll
=
0
,
sl
=
0
;
int
len
=
strlen
(
cmd
);
int
sl
,
ll
;
while
(
mail_command_table
[
i
].
shortname
!=
0
)
{
sl
=
strlen
(
mail_command_table
[
i
].
shortname
);
ll
=
strlen
(
mail_command_table
[
i
].
longname
);
if
(
sl
==
len
&&
!
strcmp
(
mail_command_table
[
i
].
shortname
,
cmd
))
return
mail_command_table
[
i
]
.
func
;
return
mail_command_table
[
i
];
else
if
(
sl
<
len
&&
!
strncmp
(
mail_command_table
[
i
].
longname
,
cmd
,
len
))
return
mail_command_table
[
i
]
.
func
;
return
mail_command_table
[
i
];
i
++
;
}
return
mail_command_table
[
i
];
}
/*
* readline tab completion
*/
char
**
util_command_completion
(
char
*
cmd
,
int
start
,
int
end
)
{
if
(
start
==
0
)
return
completion_matches
(
cmd
,
util_command_generator
);
return
NULL
;
}
/*
* more readline
*/
char
*
util_command_generator
(
char
*
text
,
int
state
)
{
static
int
i
,
len
;
char
*
name
;
if
(
!
state
)
{
i
=
0
;
len
=
strlen
(
text
);
}
while
((
name
=
mail_command_table
[
i
].
longname
))
{
i
++
;
/*if (strlen (mail_command_table[i].shortname) > strlen(name))
name = mail_command_table[i].shortname; */
if
(
strncmp
(
name
,
text
,
len
)
==
0
)
return
(
strdup
(
name
));
}
return
NULL
;
}
/*
* removes whitespace from the beginning and end of a string
*/
char
*
util_stripwhite
(
char
*
string
)
{
register
char
*
s
,
*
t
;
for
(
s
=
string
;
whitespace
(
*
s
);
s
++
)
;
if
(
*
s
==
0
)
return
s
;
t
=
s
+
strlen
(
s
)
-
1
;
while
(
t
>
s
&&
whitespace
(
*
t
))
t
--
;
*++
t
=
'\0'
;
return
s
;
}
...
...
Please
register
or
sign in
to post a comment