added more documentation with some code fix
This commit is contained in:
parent
a6c0d71710
commit
cc1438a2cf
@ -3,9 +3,10 @@
|
|||||||
@section sed_intro INTRODUCTION
|
@section sed_intro INTRODUCTION
|
||||||
|
|
||||||
The sed stream editor is a non-interactive text editing tool commonly used
|
The sed stream editor is a non-interactive text editing tool commonly used
|
||||||
on Unix environment. Sed reads text from an input stream, applies a set of
|
on Unix environment. Sed reads text from an input stream, stores it to
|
||||||
editing commands, and writes the results to an output stream. Typically,
|
pattern space, manipulates the pattern space by applying a set of editing
|
||||||
the input and output streams are a console or a file.
|
commands, and writes the pattern space to an output stream. Typically, the
|
||||||
|
input and output streams are a console or a file.
|
||||||
|
|
||||||
@b QSE provides an embeddable stream editor that supports most of
|
@b QSE provides an embeddable stream editor that supports most of
|
||||||
the conventional sed commands and implements input and output streams as a
|
the conventional sed commands and implements input and output streams as a
|
||||||
@ -28,7 +29,8 @@ A line selector selects input lines to apply a command to and has the following
|
|||||||
forms:
|
forms:
|
||||||
- address - specify a single address
|
- address - specify a single address
|
||||||
- address,address - specify an address range
|
- address,address - specify an address range
|
||||||
- start~step - specify a starting line and a step
|
- start~step - specify a starting line and a step.
|
||||||
|
#QSE_SED_CLASSIC disables this form.
|
||||||
|
|
||||||
An @b address is a line number, a regular expression, or a dollar sign ($)
|
An @b address is a line number, a regular expression, or a dollar sign ($)
|
||||||
while a @b start and a @b step is a line number.
|
while a @b start and a @b step is a line number.
|
||||||
@ -58,15 +60,15 @@ lines except the first line.
|
|||||||
A command without a line selector is applied to all input lines;
|
A command without a line selector is applied to all input lines;
|
||||||
A command with a single address is applied to an input line that matches
|
A command with a single address is applied to an input line that matches
|
||||||
the address; A command with an address range is applied to all input
|
the address; A command with an address range is applied to all input
|
||||||
lines within the range, inclusive; A command with a starting line and
|
lines within the range, inclusive; A command with a start and a step is
|
||||||
a step is applied to every @b step'th line starting from the line @b start.
|
applied to every @b step'th line starting from the line @b start.
|
||||||
|
|
||||||
Here is the summary of the commands.
|
Here is the summary of the commands.
|
||||||
|
|
||||||
- <b># comment text</b>
|
- <b># comment text</b>
|
||||||
The text beginning from # to the line end is ignored by @b sed;
|
The text beginning from # to the line end is ignored; # in a line following
|
||||||
# in a line following <b>a \\</b>, <b>i \\</b>, and <b>c \\</b> is treated
|
<b>a \\</b>, <b>i \\</b>, and <b>c \\</b> is treated literally and does not
|
||||||
literally and does not introduce a comment.
|
introduce a comment.
|
||||||
- <b>: label</b>
|
- <b>: label</b>
|
||||||
A label can be composed of letters, digits, periods, hyphens, and underlines.
|
A label can be composed of letters, digits, periods, hyphens, and underlines.
|
||||||
It remembers a target label for @b b and @b t commands and prohibits a line
|
It remembers a target label for @b b and @b t commands and prohibits a line
|
||||||
@ -74,6 +76,55 @@ selector.
|
|||||||
- <b>{</b>
|
- <b>{</b>
|
||||||
The left curly bracket forms a command group where you can nest other
|
The left curly bracket forms a command group where you can nest other
|
||||||
commands. It should be paired with an ending }.
|
commands. It should be paired with an ending }.
|
||||||
- <b>q, Q</b>
|
- <b>q</b>
|
||||||
Both commands terminates the exection of commands.
|
Terminates the exection of commands. Upon termination, it prints the pattern
|
||||||
|
space if #QSE_SED_QUIET is not set.
|
||||||
|
- <b>Q</b>
|
||||||
|
Terminates the exection of commands quietly.
|
||||||
|
- <b>a \\ \n text</b>
|
||||||
|
Stores @b text into an append buffer which is printed after the pattern
|
||||||
|
space for each input line. If #QSE_SED_CLASSIC is specified, an address range
|
||||||
|
is not allowed in the line selector.
|
||||||
|
- <b>i \\ \n text</b>
|
||||||
|
Inserts @b text into an insert buffer which is printed before the pattern
|
||||||
|
space for each input line. If #QSE_SED_CLASSIC is specified, an address range
|
||||||
|
is not allowed in the line selector.
|
||||||
|
- <b>c \\ \n text</b>
|
||||||
|
If a single line is selected for the command (i.e. no line selector, a single
|
||||||
|
address line selector, or a start~step line selector is specified), it changes
|
||||||
|
pattern space to @b text and skips all subsequent commands for the line.
|
||||||
|
If an address range is specified, it deletes pattern space and skips
|
||||||
|
subsequent commands for all input lines but the last, and changes pattern
|
||||||
|
space to @b text and skips subsequent commands for the last line.
|
||||||
|
- <b>d</b>
|
||||||
|
Deletes pattern space and skips subsequent commands for each selected line.
|
||||||
|
- <b>D</b>
|
||||||
|
Deletes the first line of pattern space. If the pattern space is emptied,
|
||||||
|
subsequent commands are skipped. Otherwise, the commands from the first are
|
||||||
|
reapplied to the current pattern space.
|
||||||
|
- <b>=</b>
|
||||||
|
Prints the current line number. If #QSE_SED_CLASSIC is speccified, an address
|
||||||
|
range is not allowed in the line selector.
|
||||||
|
- <b>p</b>
|
||||||
|
Prints pattern space.
|
||||||
|
- <b>P</b>
|
||||||
|
Prints the first line of pattern space.
|
||||||
|
- <b>l</b>
|
||||||
|
Prints pattern space in a visually unambiguous form.
|
||||||
|
- <b>h</b>
|
||||||
|
Copies pattern space to hold space
|
||||||
|
- <b>H</b>
|
||||||
|
Appends pattern space to hold space
|
||||||
|
- <b>g</b>
|
||||||
|
Copies hold space to pattern space
|
||||||
|
- <b>G</b>
|
||||||
|
Appends hold space to pattern space
|
||||||
|
- <b>x</b>
|
||||||
|
Exchanges pattern space and hold space
|
||||||
|
- <b>n</b>
|
||||||
|
Prints pattern space and read the next line from the input stream to fill
|
||||||
|
pattern space.
|
||||||
|
- <b>N</b>
|
||||||
|
Prints pattern space and read the next line from the input stream to append it
|
||||||
|
to pattern space with a newline inserted.
|
||||||
*/
|
*/
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* $Id: opt.h 189 2009-06-07 06:23:53Z hyunghwan.chung $
|
* $Id: opt.h 190 2009-06-07 12:11:56Z hyunghwan.chung $
|
||||||
*
|
*
|
||||||
Copyright 2006-2009 Chung, Hyung-Hwan.
|
Copyright 2006-2009 Chung, Hyung-Hwan.
|
||||||
|
|
||||||
@ -22,6 +22,11 @@
|
|||||||
#include <qse/types.h>
|
#include <qse/types.h>
|
||||||
#include <qse/macros.h>
|
#include <qse/macros.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
* <qse/cmn/opt.h> defines functions and data structures to process
|
||||||
|
* command-line arguments.
|
||||||
|
*/
|
||||||
|
|
||||||
typedef struct qse_opt_t qse_opt_t;
|
typedef struct qse_opt_t qse_opt_t;
|
||||||
typedef struct qse_opt_lng_t qse_opt_lng_t;
|
typedef struct qse_opt_lng_t qse_opt_lng_t;
|
||||||
|
|
||||||
@ -56,12 +61,24 @@ extern "C" {
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The qse_getopt() function returns QSE_CHAR_EOF when it finishes processing
|
* The qse_getopt() function processes the @a argc command-line arguments
|
||||||
* command line options. The return values of QSE_T('?') indicates an error.
|
* pointed to by @a argv as configured in @a opt. It can process two
|
||||||
|
* different option styles: a single character starting with '-', and a
|
||||||
|
* long name starting with '--'.
|
||||||
|
*
|
||||||
|
* A character in @a opt.str is treated as a single character option. Should
|
||||||
|
* it require a parameter, specify ':' after it.
|
||||||
|
*
|
||||||
|
* Two special returning option characters indicate special error conditions.
|
||||||
|
* - @b ? indicates a bad option stored in the @a opt->opt field.
|
||||||
|
* - @b : indicates a bad parameter for an option stored in the
|
||||||
|
* @a opt->opt field.
|
||||||
|
*
|
||||||
|
* @return an option character on success, QSE_CHAR_EOF on no more options.
|
||||||
*/
|
*/
|
||||||
qse_cint_t qse_getopt (
|
qse_cint_t qse_getopt (
|
||||||
int argc /* argument count */,
|
int argc, /* argument count */
|
||||||
qse_char_t* const* argv /* argument array */,
|
qse_char_t* const* argv, /* argument array */
|
||||||
qse_opt_t* opt /* option configuration */
|
qse_opt_t* opt /* option configuration */
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -52,7 +52,7 @@ static const qse_char_t* dflerrstr (qse_sed_t* sed, qse_sed_errnum_t errnum)
|
|||||||
QSE_T("failed to compile regular expression '${0}'"),
|
QSE_T("failed to compile regular expression '${0}'"),
|
||||||
QSE_T("failed to match regular expression"),
|
QSE_T("failed to match regular expression"),
|
||||||
QSE_T("address 1 prohibited for '${0}'"),
|
QSE_T("address 1 prohibited for '${0}'"),
|
||||||
QSE_T("address 2 prohibited"),
|
QSE_T("address 2 prohibited for '${0}'"),
|
||||||
QSE_T("address 2 missing or invalid"),
|
QSE_T("address 2 missing or invalid"),
|
||||||
QSE_T("newline expected"),
|
QSE_T("newline expected"),
|
||||||
QSE_T("backslash expected"),
|
QSE_T("backslash expected"),
|
||||||
@ -1139,7 +1139,10 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
if (sed->option & QSE_SED_CLASSIC &&
|
if (sed->option & QSE_SED_CLASSIC &&
|
||||||
cmd->a2.type != QSE_SED_ADR_NONE)
|
cmd->a2.type != QSE_SED_ADR_NONE)
|
||||||
{
|
{
|
||||||
SETERR0 (sed, QSE_SED_EA2PHB, sed->src.lnum);
|
SETERR1 (
|
||||||
|
sed, QSE_SED_EA2PHB,
|
||||||
|
sed->src.lnum, &cmd->type, 1
|
||||||
|
);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1149,6 +1152,16 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
|
|
||||||
case QSE_T('a'):
|
case QSE_T('a'):
|
||||||
case QSE_T('i'):
|
case QSE_T('i'):
|
||||||
|
if (sed->option & QSE_SED_CLASSIC &&
|
||||||
|
cmd->a2.type != QSE_SED_ADR_NONE)
|
||||||
|
{
|
||||||
|
qse_char_t tmpc = c;
|
||||||
|
SETERR1 (
|
||||||
|
sed, QSE_SED_EA2PHB,
|
||||||
|
sed->src.lnum, &tmpc, 1
|
||||||
|
);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
case QSE_T('c'):
|
case QSE_T('c'):
|
||||||
{
|
{
|
||||||
cmd->type = c;
|
cmd->type = c;
|
||||||
@ -1186,16 +1199,21 @@ static int get_command (qse_sed_t* sed, qse_sed_cmd_t* cmd)
|
|||||||
if (sed->option & QSE_SED_CLASSIC &&
|
if (sed->option & QSE_SED_CLASSIC &&
|
||||||
cmd->a2.type != QSE_SED_ADR_NONE)
|
cmd->a2.type != QSE_SED_ADR_NONE)
|
||||||
{
|
{
|
||||||
SETERR0 (sed, QSE_SED_EA2PHB, sed->src.lnum);
|
qse_char_t tmpc = c;
|
||||||
|
SETERR1 (
|
||||||
|
sed, QSE_SED_EA2PHB,
|
||||||
|
sed->src.lnum, &tmpc, 1
|
||||||
|
);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
case QSE_T('p'):
|
|
||||||
case QSE_T('P'):
|
|
||||||
case QSE_T('l'):
|
|
||||||
|
|
||||||
case QSE_T('d'):
|
case QSE_T('d'):
|
||||||
case QSE_T('D'):
|
case QSE_T('D'):
|
||||||
|
|
||||||
|
case QSE_T('p'):
|
||||||
|
case QSE_T('P'):
|
||||||
|
case QSE_T('l'):
|
||||||
|
|
||||||
case QSE_T('h'):
|
case QSE_T('h'):
|
||||||
case QSE_T('H'):
|
case QSE_T('H'):
|
||||||
case QSE_T('g'):
|
case QSE_T('g'):
|
||||||
@ -1326,7 +1344,8 @@ int qse_sed_comp (qse_sed_t* sed, const qse_char_t* sptr, qse_size_t slen)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (delim == QSE_T('~'))
|
else if (!(sed->option & QSE_SED_CLASSIC) &&
|
||||||
|
(delim == QSE_T('~')))
|
||||||
{
|
{
|
||||||
if (cmd->a1.type != QSE_SED_ADR_LINE ||
|
if (cmd->a1.type != QSE_SED_ADR_LINE ||
|
||||||
cmd->a2.type != QSE_SED_ADR_LINE)
|
cmd->a2.type != QSE_SED_ADR_LINE)
|
||||||
|
@ -138,6 +138,22 @@ static int handle_args (int argc, qse_char_t* argv[])
|
|||||||
print_usage (QSE_STDERR, argc, argv);
|
print_usage (QSE_STDERR, argc, argv);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
|
case QSE_T('?'):
|
||||||
|
qse_fprintf (QSE_STDERR,
|
||||||
|
QSE_T("ERROR: bad option - %c\n"),
|
||||||
|
opt.opt
|
||||||
|
);
|
||||||
|
print_usage (QSE_STDERR, argc, argv);
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
case QSE_T(':'):
|
||||||
|
qse_fprintf (QSE_STDERR,
|
||||||
|
QSE_T("ERROR: bad parameter for %c\n"),
|
||||||
|
opt.opt
|
||||||
|
);
|
||||||
|
print_usage (QSE_STDERR, argc, argv);
|
||||||
|
return -1;
|
||||||
|
|
||||||
case QSE_T('h'):
|
case QSE_T('h'):
|
||||||
print_usage (QSE_STDOUT, argc, argv);
|
print_usage (QSE_STDOUT, argc, argv);
|
||||||
return 0;
|
return 0;
|
||||||
@ -156,12 +172,13 @@ static int handle_args (int argc, qse_char_t* argv[])
|
|||||||
if (opt.ind < argc) g_script = argv[opt.ind++];
|
if (opt.ind < argc) g_script = argv[opt.ind++];
|
||||||
if (opt.ind < argc) g_infile = argv[opt.ind++];
|
if (opt.ind < argc) g_infile = argv[opt.ind++];
|
||||||
|
|
||||||
if (g_script == QSE_NULL)
|
if (g_script == QSE_NULL || opt.ind < argc)
|
||||||
{
|
{
|
||||||
print_usage (QSE_STDERR, argc, argv);
|
print_usage (QSE_STDERR, argc, argv);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user