1
0
mirror of git://git.sv.gnu.org/coreutils.git synced 2026-07-25 10:16:53 +02:00

(cleanup): Don't exit.

(cleanup_fatal): New functoin.  Call cleanup, then exit.
(interrupt_handler): Rewrite to reset default signal handler
then repost caught signal.
(xmalloc, xrealloc, read_input, write_to_file, handle_line_error,
process_line_count, process_regexp, create_output_file, close_output_file):
Call cleanup_fatal, not cleanup.
Add const attribute to lots of parameters.
This commit is contained in:
Jim Meyering
1995-11-15 05:32:28 +00:00
parent c2b86aabe0
commit b36e366ef4
+58 -43
View File
@@ -129,10 +129,10 @@ struct buffer_record
int safe_read ();
static void cleanup __P ((void));
static void close_output_file __P ((void));
static void create_output_file __P ((void));
static void save_line_to_file __P ((struct cstring *line));
static void delete_all_files __P ((void));
static void save_line_to_file __P ((const struct cstring *line));
static void usage __P ((int status));
/* The name this program was run with. */
@@ -232,6 +232,43 @@ static struct option const longopts[] =
{NULL, 0, NULL, 0}
};
/* Optionally remove files created so far; then exit.
Called when an error detected. */
static void
cleanup (void)
{
if (output_stream)
close_output_file ();
if (remove_files)
delete_all_files ();
}
static void
cleanup_fatal (void)
{
cleanup ();
exit (1);
}
static RETSIGTYPE
interrupt_handler (int sig)
{
#ifdef SA_INTERRUPT
struct sigaction sigact;
sigact.sa_handler = SIG_DFL;
sigemptyset (&sigact.sa_mask);
sigact.sa_flags = 0;
sigaction (sig, &sigact, NULL);
#else /* !SA_INTERRUPT */
signal (sig, SIG_DFL);
#endif /* SA_INTERRUPT */
cleanup ();
kill (getpid (), sig);
}
/* Allocate N bytes of memory dynamically, with error checking. */
static char *
@@ -243,7 +280,7 @@ xmalloc (unsigned int n)
if (p == NULL)
{
error (0, 0, _("virtual memory exhausted"));
cleanup ();
cleanup_fatal ();
}
return p;
}
@@ -267,7 +304,7 @@ xrealloc (char *p, unsigned int n)
if (p == NULL)
{
error (0, 0, _("virtual memory exhausted"));
cleanup ();
cleanup_fatal ();
}
return p;
}
@@ -306,7 +343,7 @@ read_input (char *dest, unsigned int max_n_bytes)
if (bytes_read < 0)
{
error (0, errno, _("read error"));
cleanup ();
cleanup_fatal ();
}
return bytes_read;
@@ -692,7 +729,7 @@ no_more_lines (void)
/* Set the name of the input file to NAME and open it. */
static void
set_input_file (char *name)
set_input_file (const char *name)
{
if (!strcmp (name, "-"))
input_desc = 0;
@@ -722,7 +759,7 @@ write_to_file (unsigned int last_line, boolean ignore, int argnum)
if (first_line > last_line)
{
error (0, 0, _("%s: line number out of range"), global_argv[argnum]);
cleanup ();
cleanup_fatal ();
}
lines = last_line - first_line;
@@ -733,7 +770,7 @@ write_to_file (unsigned int last_line, boolean ignore, int argnum)
if (line == NULL)
{
error (0, 0, _("%s: line number out of range"), global_argv[argnum]);
cleanup ();
cleanup_fatal ();
}
if (!ignore)
save_line_to_file (line);
@@ -755,7 +792,7 @@ dump_rest_of_file (void)
on iteration REPETITION if nonzero. */
static void
handle_line_error (struct control *p, int repetition)
handle_line_error (const struct control *p, int repetition)
{
fprintf (stderr, _("%s: `%d': line number out of range"),
program_name, p->lines_required);
@@ -764,7 +801,7 @@ handle_line_error (struct control *p, int repetition)
else
fprintf (stderr, "\n");
cleanup ();
cleanup_fatal ();
}
/* Determine the line number that marks the end of this file,
@@ -773,7 +810,7 @@ handle_line_error (struct control *p, int repetition)
REPETITION is the repetition number. */
static void
process_line_count (struct control *p, int repetition)
process_line_count (const struct control *p, int repetition)
{
unsigned int linenum;
unsigned int last_line_to_save = p->lines_required * (repetition + 1);
@@ -820,7 +857,7 @@ regexp_error (struct control *p, int repetition, boolean ignore)
dump_rest_of_file ();
close_output_file ();
}
cleanup ();
cleanup_fatal ();
}
/* Read the input until a line matches the regexp in P, outputting
@@ -869,7 +906,7 @@ process_regexp (struct control *p, int repetition)
if (ret == -2)
{
error (0, 0, _("error in regular expression search"));
cleanup ();
cleanup_fatal ();
}
if (ret == -1)
{
@@ -909,7 +946,7 @@ process_regexp (struct control *p, int repetition)
if (ret == -2)
{
error (0, 0, _("error in regular expression search"));
cleanup ();
cleanup_fatal ();
}
if (ret >= 0)
break;
@@ -978,7 +1015,7 @@ create_output_file (void)
if (output_stream == NULL)
{
error (0, errno, "%s", output_filename);
cleanup ();
cleanup_fatal ();
}
files_created++;
bytes_written = 0;
@@ -1012,7 +1049,7 @@ close_output_file (void)
{
error (0, errno, _("write error for `%s'"), output_filename);
output_stream = NULL;
cleanup ();
cleanup_fatal ();
}
if (bytes_written == 0 && elide_empty_files)
{
@@ -1027,26 +1064,11 @@ close_output_file (void)
}
}
/* Optionally remove files created so far; then exit.
Called when an error detected. */
static void
cleanup (void)
{
if (output_stream)
close_output_file ();
if (remove_files)
delete_all_files ();
exit (1);
}
/* Save line LINE to the output file and
increment the character count for the current file. */
static void
save_line_to_file (struct cstring *line)
save_line_to_file (const struct cstring *line)
{
fwrite (line->str, sizeof (char), line->len, output_stream);
bytes_written += line->len;
@@ -1088,7 +1110,7 @@ new_control_record (void)
/* FIXME: use xstrtoul in place of this function. */
static boolean
string_to_number (int *result, char *num)
string_to_number (int *result, const char *num)
{
char ch;
int val = 0;
@@ -1113,7 +1135,7 @@ string_to_number (int *result, char *num)
NUM is the numeric part of STR. */
static void
check_for_offset (struct control *p, char *str, char *num)
check_for_offset (struct control *p, const char *str, const char *num)
{
if (*num != '-' && *num != '+')
error (1, 0, _("%s: `+' or `-' expected after delimeter"), str);
@@ -1184,7 +1206,7 @@ extract_regexp (int argnum, boolean ignore, char *str)
if (err)
{
error (0, 0, _("%s: invalid regular expression: %s"), str, err);
cleanup ();
cleanup_fatal ();
}
if (closing_delim[1])
@@ -1377,13 +1399,6 @@ max_out (char *format)
return out_count;
}
static void
interrupt_handler (int signum)
{
error (0, 0, _("interrupted"));
cleanup ();
}
void
main (int argc, char **argv)
{
@@ -1497,7 +1512,7 @@ main (int argc, char **argv)
if (close (input_desc) < 0)
{
error (0, errno, _("read error"));
cleanup ();
cleanup_fatal ();
}
exit (0);