summaryrefslogtreecommitdiff
path: root/sed/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'sed/utils.c')
-rw-r--r--sed/utils.c233
1 files changed, 84 insertions, 149 deletions
diff --git a/sed/utils.c b/sed/utils.c
index aa674fd..8afea8e 100644
--- a/sed/utils.c
+++ b/sed/utils.c
@@ -1,6 +1,5 @@
/* Functions from hack's utils library.
- Copyright (C) 1989, 1990, 1991, 1998, 1999, 2003, 2008, 2009, 2011
- Free Software Foundation, Inc.
+ Copyright (C) 1989-2016 Free Software Foundation, Inc.
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -16,7 +15,7 @@
along with this program; if not, write to the Free Software
Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */
-#include "config.h"
+#include <config.h>
#include <stdio.h>
#include <stdarg.h>
@@ -28,8 +27,8 @@
#include <unistd.h>
#include <limits.h>
+#include "unlocked-io.h"
#include "utils.h"
-#include "pathmax.h"
#include "fwriting.h"
const char *myname;
@@ -66,26 +65,25 @@ panic(const char *str, ...)
while (open_files)
{
if (open_files->temp)
- {
- fclose (open_files->fp);
- errno = 0;
- unlink (open_files->name);
+ {
+ fclose (open_files->fp);
+ errno = 0;
+ unlink (open_files->name);
if (errno != 0)
- fprintf (stderr, _("cannot remove %s: %s"), open_files->name, strerror (errno));
- }
+ fprintf (stderr, _("cannot remove %s: %s"), open_files->name,
+ strerror (errno));
+ }
open_files = open_files->link;
}
- exit(4);
+ exit(EXIT_PANIC);
}
/* Internal routine to get a filename from open_files */
-static const char *utils_fp_name (FILE *fp);
-static const char *
-utils_fp_name(fp)
- FILE *fp;
+static const char * _GL_ATTRIBUTE_PURE
+utils_fp_name(FILE *fp)
{
struct open_file *p;
@@ -103,19 +101,16 @@ utils_fp_name(fp)
}
static void
-register_open_file (fp, name, temp)
- FILE *fp;
- const char *name;
- int temp;
+register_open_file (FILE *fp, const char *name)
{
struct open_file *p;
for (p=open_files; p; p=p->link)
{
if (fp == p->fp)
- {
- free(p->name);
- break;
- }
+ {
+ free(p->name);
+ break;
+ }
}
if (!p)
{
@@ -130,10 +125,7 @@ register_open_file (fp, name, temp)
/* Panic on failing fopen */
FILE *
-ck_fopen(name, mode, fail)
- const char *name;
- const char *mode;
- int fail;
+ck_fopen(const char *name, const char *mode, int fail)
{
FILE *fp;
@@ -146,17 +138,13 @@ ck_fopen(name, mode, fail)
return NULL;
}
- register_open_file (fp, name, false);
+ register_open_file (fp, name);
return fp;
}
/* Panic on failing fdopen */
FILE *
-ck_fdopen(fd, name, mode, fail)
- int fd;
- const char *name;
- const char *mode;
- int fail;
+ck_fdopen( int fd, const char *name, const char *mode, int fail)
{
FILE *fp;
@@ -169,75 +157,47 @@ ck_fdopen(fd, name, mode, fail)
return NULL;
}
- register_open_file (fp, name, false);
+ register_open_file (fp, name);
return fp;
}
FILE *
-ck_mkstemp (p_filename, tmpdir, base, mode)
- char **p_filename;
- const char *base, *tmpdir;
- const char *mode;
+ck_mkstemp (char **p_filename, const char *tmpdir,
+ const char *base, const char *mode)
{
- char *template;
- FILE *fp;
- int fd;
- int save_umask;
-
- if (tmpdir == NULL)
- tmpdir = getenv("TMPDIR");
- if (tmpdir == NULL)
- {
- tmpdir = getenv("TMP");
- if (tmpdir == NULL)
-#ifdef P_tmpdir
- tmpdir = P_tmpdir;
-#else
- tmpdir = "/tmp";
-#endif
- }
-
- template = xmalloc (strlen (tmpdir) + strlen (base) + 8);
+ char *template = xmalloc (strlen (tmpdir) + strlen (base) + 8);
sprintf (template, "%s/%sXXXXXX", tmpdir, base);
/* The ownership might change, so omit some permissions at first
so unauthorized users cannot nip in before the file is ready.
-
mkstemp forces O_BINARY on cygwin, so use mkostemp instead. */
- save_umask = umask (0700);
- fd = mkostemp (template, 0);
+ mode_t save_umask = umask (0700);
+ int fd = mkostemp (template, 0);
umask (save_umask);
if (fd == -1)
panic(_("couldn't open temporary file %s: %s"), template, strerror(errno));
*p_filename = template;
- fp = fdopen (fd, mode);
- register_open_file (fp, template, true);
+ FILE *fp = fdopen (fd, mode);
+ register_open_file (fp, template);
return fp;
}
/* Panic on failing fwrite */
void
-ck_fwrite(ptr, size, nmemb, stream)
- const void *ptr;
- size_t size;
- size_t nmemb;
- FILE *stream;
+ck_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
{
clearerr(stream);
if (size && fwrite(ptr, size, nmemb, stream) != nmemb)
- panic(ngettext("couldn't write %d item to %s: %s",
- "couldn't write %d items to %s: %s", nmemb),
- nmemb, utils_fp_name(stream), strerror(errno));
+ panic(ngettext("couldn't write %llu item to %s: %s",
+ "couldn't write %llu items to %s: %s", nmemb),
+ (unsigned long long) nmemb, utils_fp_name(stream),
+ strerror(errno));
}
/* Panic on failing fread */
size_t
-ck_fread(ptr, size, nmemb, stream)
- void *ptr;
- size_t size;
- size_t nmemb;
- FILE *stream;
+ck_fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
{
clearerr(stream);
if (size && (nmemb=fread(ptr, size, nmemb, stream)) <= 0 && ferror(stream))
@@ -247,11 +207,7 @@ ck_fread(ptr, size, nmemb, stream)
}
size_t
-ck_getdelim(text, buflen, buffer_delimiter, stream)
- char **text;
- size_t *buflen;
- char buffer_delimiter;
- FILE *stream;
+ck_getdelim(char **text, size_t *buflen, char buffer_delimiter, FILE *stream)
{
ssize_t result;
bool error;
@@ -271,8 +227,7 @@ ck_getdelim(text, buflen, buffer_delimiter, stream)
/* Panic on failing fflush */
void
-ck_fflush(stream)
- FILE *stream;
+ck_fflush(FILE *stream)
{
if (!fwriting(stream))
return;
@@ -284,8 +239,7 @@ ck_fflush(stream)
/* Panic on failing fclose */
void
-ck_fclose(stream)
- FILE *stream;
+ck_fclose(FILE *stream)
{
struct open_file r;
struct open_file *prev;
@@ -297,14 +251,14 @@ ck_fclose(stream)
while ( (cur = prev->link) )
{
if (!stream || stream == cur->fp)
- {
- do_ck_fclose (cur->fp);
- prev->link = cur->link;
- free(cur->name);
- free(cur);
- }
+ {
+ do_ck_fclose (cur->fp);
+ prev->link = cur->link;
+ free(cur->name);
+ free(cur);
+ }
else
- prev = cur;
+ prev = cur;
}
open_files = r.link;
@@ -321,8 +275,7 @@ ck_fclose(stream)
/* Close a single file. */
void
-do_ck_fclose(fp)
- FILE *fp;
+do_ck_fclose(FILE *fp)
{
ck_fflush(fp);
clearerr(fp);
@@ -369,37 +322,37 @@ follow_symlink(const char *fname)
buf2 = ck_realloc (buf2, buf_size);
}
if (rc < 0)
- panic (_("couldn't follow symlink %s: %s"), buf, strerror(errno));
+ panic (_("couldn't follow symlink %s: %s"), buf, strerror(errno));
else
- buf2 [rc] = '\0';
+ buf2 [rc] = '\0';
if (buf2[0] != '/' && (c = strrchr (buf, '/')) != NULL)
- {
- /* Need to handle relative paths with care. Reallocate buf1 and
- buf2 to be big enough. */
- int len = c - buf + 1;
- if (len + rc + 1 > buf_size)
- {
- buf_size = len + rc + 1;
- buf1 = ck_realloc (buf1, buf_size);
- buf2 = ck_realloc (buf2, buf_size);
- }
-
- /* Always store the new path in buf1. */
- if (buf != buf1)
+ {
+ /* Need to handle relative paths with care. Reallocate buf1 and
+ buf2 to be big enough. */
+ int len = c - buf + 1;
+ if (len + rc + 1 > buf_size)
+ {
+ buf_size = len + rc + 1;
+ buf1 = ck_realloc (buf1, buf_size);
+ buf2 = ck_realloc (buf2, buf_size);
+ }
+
+ /* Always store the new path in buf1. */
+ if (buf != buf1)
memcpy (buf1, buf, len);
/* Tack the relative symlink at the end of buf1. */
memcpy (buf1 + len, buf2, rc + 1);
- buf = buf1;
- }
+ buf = buf1;
+ }
else
- {
- /* Use buf2 as the buffer, it saves a strcpy if it is not pointing to
- another link. It works for absolute symlinks, and as long as
- symlinks do not leave the current directory. */
- buf = buf2;
- }
+ {
+ /* Use buf2 as the buffer, it saves a strcpy if it is not pointing to
+ another link. It works for absolute symlinks, and as long as
+ symlinks do not leave the current directory. */
+ buf = buf2;
+ }
}
if (rc < 0)
@@ -413,9 +366,7 @@ follow_symlink(const char *fname)
/* Panic on failing rename */
void
-ck_rename (from, to, unlink_if_fail)
- const char *from, *to;
- const char *unlink_if_fail;
+ck_rename (const char *from, const char *to, const char *unlink_if_fail)
{
int rd = rename (from, to);
if (rd != -1)
@@ -427,7 +378,8 @@ ck_rename (from, to, unlink_if_fail)
errno = 0;
unlink (unlink_if_fail);
- /* Failure to remove the temporary file is more severe, so trigger it first. */
+ /* Failure to remove the temporary file is more severe,
+ so trigger it first. */
if (errno != 0)
panic (_("cannot remove %s: %s"), unlink_if_fail, strerror (errno));
@@ -442,8 +394,7 @@ ck_rename (from, to, unlink_if_fail)
/* Panic on failing malloc */
void *
-ck_malloc(size)
- size_t size;
+ck_malloc(size_t size)
{
void *ret = calloc(1, size ? size : 1);
if (!ret)
@@ -453,9 +404,7 @@ ck_malloc(size)
/* Panic on failing realloc */
void *
-ck_realloc(ptr, size)
- void *ptr;
- size_t size;
+ck_realloc(void *ptr, size_t size)
{
void *ret;
@@ -474,8 +423,7 @@ ck_realloc(ptr, size)
/* Return a malloc()'d copy of a string */
char *
-ck_strdup(str)
- const char *str;
+ck_strdup(const char *str)
{
char *ret = MALLOC(strlen(str)+1, char);
return strcpy(ret, str);
@@ -483,9 +431,7 @@ ck_strdup(str)
/* Return a malloc()'d copy of a block of memory */
void *
-ck_memdup(buf, len)
- const void *buf;
- size_t len;
+ck_memdup(const void *buf, size_t len)
{
void *ret = ck_malloc(len);
return memcpy(ret, buf, len);
@@ -505,7 +451,7 @@ struct buffer
#define MIN_ALLOCATE 50
struct buffer *
-init_buffer()
+init_buffer(void)
{
struct buffer *b = MALLOC(1, struct buffer);
b->b = MALLOC(MIN_ALLOCATE, char);
@@ -515,24 +461,19 @@ init_buffer()
}
char *
-get_buffer(b)
- struct buffer *b;
+get_buffer(struct buffer const *b)
{
return b->b;
}
size_t
-size_buffer(b)
- struct buffer *b;
+size_buffer(struct buffer const *b)
{
return b->length;
}
-static void resize_buffer (struct buffer *b, size_t newlen);
static void
-resize_buffer(b, newlen)
- struct buffer *b;
- size_t newlen;
+resize_buffer(struct buffer *b, size_t newlen)
{
char *try = NULL;
size_t alen = b->allocated;
@@ -552,10 +493,7 @@ resize_buffer(b, newlen)
}
char *
-add_buffer(b, p, n)
- struct buffer *b;
- const char *p;
- size_t n;
+add_buffer(struct buffer *b, const char *p, size_t n)
{
char *result;
if (b->allocated - b->length < n)
@@ -566,9 +504,7 @@ add_buffer(b, p, n)
}
char *
-add1_buffer(b, c)
- struct buffer *b;
- int c;
+add1_buffer(struct buffer *b, int c)
{
/* This special case should be kept cheap;
* don't make it just a mere convenience
@@ -580,7 +516,7 @@ add1_buffer(b, c)
{
char *result;
if (b->allocated - b->length < 1)
- resize_buffer(b, b->length+1);
+ resize_buffer(b, b->length+1);
result = b->b + b->length++;
*result = c;
return result;
@@ -590,8 +526,7 @@ add1_buffer(b, c)
}
void
-free_buffer(b)
- struct buffer *b;
+free_buffer(struct buffer *b)
{
if (b)
free(b->b);