summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile.am3
-rw-r--r--configure.ac1
-rw-r--r--include/xalloc.h46
-rw-r--r--lib/Makefile.am3
-rw-r--r--lib/canonicalize.c14
-rw-r--r--man/ru/Makefile.am5
-rw-r--r--man/ru/ddate.1123
-rw-r--r--misc-utils/look.c50
-rw-r--r--misc-utils/namei.c6
-rw-r--r--misc-utils/rename.c8
-rw-r--r--misc-utils/setterm.c1
-rw-r--r--misc-utils/wipefs.c10
-rw-r--r--mount/mount.85
-rw-r--r--mount/umount.c15
-rw-r--r--shlibs/blkid/src/dev.c2
-rw-r--r--sys-utils/ctrlaltdel.c47
-rw-r--r--text-utils/column.c129
17 files changed, 311 insertions, 157 deletions
diff --git a/Makefile.am b/Makefile.am
index 9febbfd9..616669d2 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -14,6 +14,8 @@ if BUILD_LIBMOUNT
SHLIBS_DIRS += shlibs/mount
endif
+MAN_DIRS = man/ru
+
SUBDIRS = \
include \
disk-utils \
@@ -21,6 +23,7 @@ SUBDIRS = \
getopt \
lib \
$(SHLIBS_DIRS) \
+ $(MAN_DIRS) \
login-utils \
misc-utils \
po \
diff --git a/configure.ac b/configure.ac
index eaa5945f..561424a6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1142,6 +1142,7 @@ include/Makefile
lib/Makefile
login-utils/Makefile
Makefile
+man/ru/Makefile
misc-utils/chkdupexe:misc-utils/chkdupexe.pl
misc-utils/Makefile
mount/Makefile
diff --git a/include/xalloc.h b/include/xalloc.h
new file mode 100644
index 00000000..2a8c78bc
--- /dev/null
+++ b/include/xalloc.h
@@ -0,0 +1,46 @@
+/*
+ * Copyright (C) 2010 Davidlohr Bueso <dave@gnu.org>
+ *
+ * This file may be redistributed under the terms of the
+ * GNU Lesser General Public License.
+ *
+ * General memory allocation wrappers for malloc, realloc and calloc
+ */
+
+#ifndef UTIL_LINUX_XALLOC_H
+#define UTIL_LINUX_XALLOC_H
+
+#include <stdlib.h>
+#include <err.h>
+
+static inline __attribute__((alloc_size(1)))
+void *xmalloc(const size_t size)
+{
+ void *ret = malloc(size);
+
+ if (!ret && size)
+ err(EXIT_FAILURE, "cannot allocate %zu bytes", size);
+ return ret;
+}
+
+static inline __attribute__((alloc_size(2)))
+void *xrealloc(void *ptr, const size_t size)
+{
+ void *ret = realloc(ptr, size);
+
+ if (!ret && size)
+ err(EXIT_FAILURE, "cannot allocate %zu bytes", size);
+ return ret;
+}
+
+static inline __attribute__((alloc_size(1,2)))
+void *xcalloc(const size_t nelems, const size_t size)
+{
+ void *ret = calloc(nelems, size);
+
+ if (!ret && size && nelems)
+ err(EXIT_FAILURE, "cannot allocate %zu bytes", size);
+ return ret;
+}
+
+#endif
diff --git a/lib/Makefile.am b/lib/Makefile.am
index 2a185f34..45d319d3 100644
--- a/lib/Makefile.am
+++ b/lib/Makefile.am
@@ -3,7 +3,7 @@ include $(top_srcdir)/config/include-Makefile.am
AM_CPPFLAGS += -DTEST_PROGRAM
noinst_PROGRAMS = test_blkdev test_ismounted test_wholedisk test_mangle \
- test_strtosize test_tt
+ test_strtosize test_tt test_canonicalize
if LINUX
if HAVE_CPU_SET_T
noinst_PROGRAMS += test_cpuset
@@ -19,6 +19,7 @@ if LINUX
test_cpuset_SOURCES = cpuset.c
endif
test_tt_SOURCES = tt.c
+test_canonicalize_SOURCES = canonicalize.c
if LINUX
test_blkdev_SOURCES += linux_version.c
diff --git a/lib/canonicalize.c b/lib/canonicalize.c
index 29b3f259..1449851f 100644
--- a/lib/canonicalize.c
+++ b/lib/canonicalize.c
@@ -189,3 +189,17 @@ canonicalize_path(const char *path)
}
+#ifdef TEST_PROGRAM
+int main(int argc, char **argv)
+{
+ if (argc < 2) {
+ fprintf(stderr, "usage: %s <device>\n", argv[0]);
+ exit(EXIT_FAILURE);
+ }
+
+ fprintf(stdout, "orig: %s\n", argv[1]);
+ fprintf(stdout, "real: %s\n", canonicalize_path(argv[1]));
+
+ exit(EXIT_SUCCESS);
+}
+#endif
diff --git a/man/ru/Makefile.am b/man/ru/Makefile.am
new file mode 100644
index 00000000..60845958
--- /dev/null
+++ b/man/ru/Makefile.am
@@ -0,0 +1,5 @@
+include $(top_srcdir)/config/include-Makefile.am
+
+mandir = @mandir@/ru
+
+dist_man_MANS = ddate.1
diff --git a/man/ru/ddate.1 b/man/ru/ddate.1
new file mode 100644
index 00000000..59080236
--- /dev/null
+++ b/man/ru/ddate.1
@@ -0,0 +1,123 @@
+.\" All Rites Reversed. This file is in the PUBLIC DOMAIN.
+.\" Kallisti.
+.TH DDATE 1 "59 Bureaucracy 3161" "" "Emperor Norton Utilities"
+.SH ИМЯ
+ddate \- преобразует дату в григорианском формате в соответствующую дату в
+дискордианском формате
+.SH ОБЗОР
+.B ddate
+.RI [ \fB+\fPформат]
+.RI [ дата ]
+.SH ОПИСАНИЕ
+.B ddate
+выводит дату в дискордианском формате.
+.PP
+Если команда
+.B ddate
+вызвана без параметров, она получает текущую системную дату, преобразует её в
+дискордианский формат и выводит на стандартный вывод. Также можно указать в
+командной строке дату в григорианском формате, указав в числовом виде день,
+месяц и год.
+.PP
+Если указан спецификатор формата вывода, дата в дискордианском формате будет
+отображена в том виде, как это определено спецификатором. Этот механизм
+работает подобно механизму форматирования команды
+.B date(1),
+но почти полностью иначе. Поля спецификатора следующие:
+.IP %A
+Полное название дня недели (например, Sweetmorn)
+.IP %a
+День недели в сокращенном формате (например, SM)
+.IP %B
+Полное название сезона (времени года) (например, Chaos)
+.IP %b
+Сокращенное название сезона (например, Chs)
+.IP %d
+Порядковый номер дня в сезоне (например, 23)
+.IP %e
+Числовое представление номера дня в сезоне (например, 23rd)
+.IP %H
+Название текущего праздника, если таковой имеется
+.IP %N
+Волшебный код для предотвращения вывода следующего за ним форматирования,
+в случае, если дата не является праздником.
+.IP %n
+Новая строка
+.IP %t
+Табуляция
+.IP %X
+Число дней до наступления Дня X (X-Day). Опция не действует, если утилита
+без опции SubGenius.
+.IP %{
+.IP %}
+Используется для указания части строки, которая будет заменена словами
+"St. Tib's Day", если текущий день является Днем святого Тиба (St. Tib's day).
+.IP %\.
+Попробуйте и увидите.
+.bp
+.SH ПРИМЕРЫ
+.nf
+% ddate
+.br
+Sweetmorn, Bureaucracy 42, 3161 YOLD
+.PP
+% ddate +'Today is %{%A, the %e of %B%}, %Y. %N%nCelebrate %H'
+.br
+Today is Sweetmorn, the 42nd of Bureaucracy, 3161.
+.PP
+% ddate +"It's %{%A, the %e of %B%}, %Y. %N%nCelebrate %H" 26 9 1995
+.br
+It's Prickle-Prickle, the 50th of Bureaucracy, 3161.
+.br
+Celebrate Bureflux
+.PP
+% ddate +"Today's %{%A, the %e of %B%}, %Y. %N%nCelebrate %H" 29 2 1996
+.br
+Today's St. Tib's Day, 3162.
+.br
+
+.SH ОШИБКИ
+
+.B ddate(1)
+будет вести себя непредсказуемо, если попросить вывести дату Дня святого Тиба
+но строка спецификатора форматирования при этом не содержит разделителей,
+предусмотренных специально для этого случая (%{ и %}).
+
+.SH ЗАМЕЧАНИЯ
+
+После того, как День Икс (5 июля 1998 года - прим. пер.) прошел без
+происшествий, Церковь СубГения (Church of the SubGenius) провозгласила,
+что он должен наступить в 'году вверх тормашками' - День Икс наступит в 8661
+году н. э., а не в 1998 н. э. Таким образом, Истинный День Икс - это 40 день
+сезона Замешательства 9827 года (Cfn 40, 9827).
+
+.SH АВТОРЫ
+.nh
+Автор оригинальной программы Druel the Chaotic aka Jeremy Johnson
+(mpython@gnu.ai.mit.edu)
+.br
+Переписана преимущественно Lee H:. O:. Smith, KYTP, aka Andrew Bulhak
+(acb@dev.null.org)
+.br
+Пять тонн льна.
+
+.SH РАСПРОСТРАНЕНИЕ
+
+Свободно распространяемое ПО. Все права защищены.
+
+.SH СМ. ТАКЖЕ
+
+date(1),
+.br
+http://www.subgenius.com/
+.br
+Малаклипс Младший (Malaclypse the Younger),
+.I "Principia Discordia, или Как я нашел Богиню и что я с Ней сделал когда
+нашел"
+
+.SH ДОСТУПНОСТЬ
+Команда ddate является частью пакета util-linux-ng и доступна по
+ftp://ftp.kernel.org/pub/linux/utils/util-linux-ng/.
+
+.SH ПЕРЕВОД
+Перевод Rino_ap_Codkelden <mavladi@gmail.com> 2010 \ No newline at end of file
diff --git a/misc-utils/look.c b/misc-utils/look.c
index 54fbb918..85a8cc1b 100644
--- a/misc-utils/look.c
+++ b/misc-utils/look.c
@@ -59,8 +59,10 @@
#include <strings.h>
#include <ctype.h>
#include <getopt.h>
-#include "pathnames.h"
+
#include "nls.h"
+#include "xalloc.h"
+#include "pathnames.h"
#define EQUAL 0
#define GREATER 1
@@ -75,7 +77,6 @@ char *comparbuf;
static char *binary_search (char *, char *);
static int compare (char *, char *);
-static void err (const char *fmt, ...);
static char *linear_search (char *, char *);
static int look (char *, char *);
static void print_from (char *, char *);
@@ -101,7 +102,7 @@ main(int argc, char *argv[])
while ((ch = getopt(argc, argv, "adft:")) != -1)
switch(ch) {
case 'a':
- file = _PATH_WORDS_ALT;
+ file = _PATH_WORDS_ALT;
break;
case 'd':
dflag = 1;
@@ -136,7 +137,7 @@ main(int argc, char *argv[])
*++p = '\0';
if ((fd = open(file, O_RDONLY, 0)) < 0 || fstat(fd, &sb))
- err("%s: %s", file, strerror(errno));
+ err(EXIT_FAILURE, "%s", file);
front = mmap(NULL, (size_t) sb.st_size, PROT_READ,
#ifdef MAP_FILE
MAP_FILE |
@@ -144,11 +145,11 @@ main(int argc, char *argv[])
MAP_SHARED, fd, (off_t) 0);
if
#ifdef MAP_FAILED
- (front == MAP_FAILED)
+ (front == MAP_FAILED)
#else
- ((void *)(front) <= (void *)0)
+ ((void *)(front) <= (void *)0)
#endif
- err("%s: %s", file, strerror(errno));
+ err(EXIT_FAILURE, "%s", file);
#if 0
/* workaround for mmap problem (rmiller@duskglow.com) */
@@ -177,9 +178,7 @@ look(char *front, char *back)
} else
stringlen = strlen(string);
- comparbuf = malloc(stringlen+1);
- if (comparbuf == NULL)
- err(_("Out of memory"));
+ comparbuf = xmalloc(stringlen+1);
front = binary_search(front, back);
front = linear_search(front, back);
@@ -296,7 +295,7 @@ print_from(char *front, char *back)
eol = 0;
while (front < back && !eol) {
if (putchar(*front) == EOF)
- err("stdout: %s", strerror(errno));
+ err(EXIT_FAILURE, "stdout");
if (*front++ == '\n')
eol = 1;
}
@@ -354,32 +353,3 @@ usage()
(void)fprintf(stderr, _("usage: look [-dfa] [-t char] string [file]\n"));
exit(2);
}
-
-#if __STDC__
-#include <stdarg.h>
-#else
-#include <varargs.h>
-#endif
-
-void
-#if __STDC__
-err(const char *fmt, ...)
-#else
-err(fmt, va_alist)
- char *fmt;
- va_dcl
-#endif
-{
- va_list ap;
-#if __STDC__
- va_start(ap, fmt);
-#else
- va_start(ap);
-#endif
- (void)fprintf(stderr, "look: ");
- (void)vfprintf(stderr, fmt, ap);
- va_end(ap);
- (void)fprintf(stderr, "\n");
- exit(2);
- /* NOTREACHED */
-}
diff --git a/misc-utils/namei.c b/misc-utils/namei.c
index 9873cda9..0342a08c 100644
--- a/misc-utils/namei.c
+++ b/misc-utils/namei.c
@@ -19,6 +19,7 @@
* Arkadiusz Mikiewicz (1999-02-22)
* Li Zefan (2007-09-10).
*/
+
#include <stdio.h>
#include <unistd.h>
#include <getopt.h>
@@ -34,6 +35,7 @@
#include <grp.h>
#include "c.h"
+#include "xalloc.h"
#include "nls.h"
#include "widechar.h"
@@ -194,9 +196,7 @@ readlink_to_namei(struct namei *nm, const char *path)
if (nm->relstart)
sz += nm->relstart + 1;
}
- nm->abslink = malloc(sz + 1);
- if (!nm->abslink)
- err(EXIT_FAILURE, _("out of memory?"));
+ nm->abslink = xmalloc(sz + 1);
if (*sym != '/' && nm->relstart) {
/* create the absolute path from the relative symlink */
diff --git a/misc-utils/rename.c b/misc-utils/rename.c
index 87262b80..495e511c 100644
--- a/misc-utils/rename.c
+++ b/misc-utils/rename.c
@@ -17,7 +17,9 @@ for i in $@; do N=`echo "$i" | sed "s/$FROM/$TO/g"`; mv "$i" "$N"; done
#include <string.h>
#include <stdlib.h>
#include <errno.h>
+
#include "nls.h"
+#include "xalloc.h"
static char *progname;
@@ -33,11 +35,7 @@ do_rename(char *from, char *to, char *s) {
flen = strlen(from);
tlen = strlen(to);
slen = strlen(s);
- newname = malloc(tlen+slen+1);
- if (newname == NULL) {
- fprintf(stderr, _("%s: out of memory\n"), progname);
- exit(1);
- }
+ newname = xmalloc(tlen+slen+1);
p = s;
q = newname;
diff --git a/misc-utils/setterm.c b/misc-utils/setterm.c
index 2601ffc6..14b2c3df 100644
--- a/misc-utils/setterm.c
+++ b/misc-utils/setterm.c
@@ -117,6 +117,7 @@
#endif
#include "c.h"
+#include "xalloc.h"
#include "nls.h"
#if __GNU_LIBRARY__ < 5
diff --git a/misc-utils/wipefs.c b/misc-utils/wipefs.c
index c0b29f0e..dbfabc4a 100644
--- a/misc-utils/wipefs.c
+++ b/misc-utils/wipefs.c
@@ -34,6 +34,7 @@
#include <blkid.h>
#include "nls.h"
+#include "xalloc.h"
#include "strtosize.h"
struct wipe_desc {
@@ -135,15 +136,6 @@ add_offset(struct wipe_desc *wp0, loff_t offset, int zap)
return wp;
}
-static inline void *
-xmalloc(size_t sz)
-{
- void *x = malloc(sz);
- if (!x)
- err(EXIT_FAILURE, _("malloc failed"));
- return x;
-}
-
static inline char *
xstrdup(const char *s)
{
diff --git a/mount/mount.8 b/mount/mount.8
index b33e62f5..7bffbb5b 100644
--- a/mount/mount.8
+++ b/mount/mount.8
@@ -663,11 +663,6 @@ Creating a file
.I /etc/filesystems
can be useful to change the probe order (e.g., to try vfat before msdos
or ext3 before ext2) or if you use a kernel module autoloader.
-Warning: the probing uses a heuristic (the presence of appropriate `magic'),
-and could recognize the wrong filesystem type, possibly with catastrophic
-consequences. If your data is valuable, don't ask
-.B mount
-to guess.
More than one type may be specified in a comma separated
list. The list of filesystem types can be prefixed with
diff --git a/mount/umount.c b/mount/umount.c
index 49741a51..b5ff8a17 100644
--- a/mount/umount.c
+++ b/mount/umount.c
@@ -267,15 +267,20 @@ umount_one (const char *spec, const char *node, const char *type,
res = mount(spec, node, NULL,
MS_MGC_VAL | MS_REMOUNT | MS_RDONLY, NULL);
if (res == 0) {
- struct my_mntent remnt;
fprintf(stderr,
_("umount: %s busy - remounted read-only\n"),
spec);
- remnt.mnt_type = remnt.mnt_fsname = NULL;
- remnt.mnt_dir = xstrdup(node);
- remnt.mnt_opts = xstrdup("ro");
- if (!nomtab)
+ if (mc && !nomtab) {
+ /* update mtab if the entry is there */
+ struct my_mntent remnt;
+ remnt.mnt_fsname = mc->m.mnt_fsname;
+ remnt.mnt_dir = mc->m.mnt_dir;
+ remnt.mnt_type = mc->m.mnt_type;
+ remnt.mnt_opts = "ro";
+ remnt.mnt_freq = 0;
+ remnt.mnt_passno = 0;
update_mtab(node, &remnt);
+ }
return 0;
} else if (errno != EBUSY) { /* hmm ... */
perror("remount");
diff --git a/shlibs/blkid/src/dev.c b/shlibs/blkid/src/dev.c
index 24d989dd..791a6c18 100644
--- a/shlibs/blkid/src/dev.c
+++ b/shlibs/blkid/src/dev.c
@@ -193,6 +193,8 @@ extern void blkid_dev_iterate_end(blkid_dev_iterate iter)
if (!iter || iter->magic != DEV_ITERATE_MAGIC)
return;
iter->magic = 0;
+ free(iter->search_type);
+ free(iter->search_value);
free(iter);
}
diff --git a/sys-utils/ctrlaltdel.c b/sys-utils/ctrlaltdel.c
index beabc605..cfab79a3 100644
--- a/sys-utils/ctrlaltdel.c
+++ b/sys-utils/ctrlaltdel.c
@@ -1,48 +1,37 @@
/*
* ctrlaltdel.c - Set the function of the Ctrl-Alt-Del combination
* Created 4-Jul-92 by Peter Orbaek <poe@daimi.aau.dk>
- * ftp://ftp.daimi.aau.dk/pub/linux/poe/
* 1999-02-22 Arkadiusz Mikiewicz <misiek@pld.ORG.PL>
* - added Native Language Support
- *
*/
+#include <err.h>
#include <stdio.h>
-#include <unistd.h>
#include <stdlib.h>
#include <string.h>
+#include <errno.h>
#include "linux_reboot.h"
#include "nls.h"
-int
-main(int argc, char *argv[]) {
-
+int main(int argc, char *argv[])
+{
setlocale(LC_ALL, "");
bindtextdomain(PACKAGE, LOCALEDIR);
textdomain(PACKAGE);
-
-
- if(geteuid()) {
- fprintf(stderr,
- _("You must be root to set the Ctrl-Alt-Del behaviour.\n"));
- exit(1);
- }
- if(argc == 2 && !strcmp("hard", argv[1])) {
- if(my_reboot(LINUX_REBOOT_CMD_CAD_ON) < 0) {
- perror("ctrlaltdel: reboot");
- exit(1);
- }
- } else if(argc == 2 && !strcmp("soft", argv[1])) {
- if(my_reboot(LINUX_REBOOT_CMD_CAD_OFF) < 0) {
- perror("ctrlaltdel: reboot");
- exit(1);
- }
- } else {
- fprintf(stderr, _("Usage: ctrlaltdel hard|soft\n"));
- exit(1);
- }
- exit(0);
-}
+ if (geteuid())
+ errx(EXIT_FAILURE,
+ _("You must be root to set the Ctrl-Alt-Del behaviour"));
+ if (argc == 2 && !strcmp("hard", argv[1])) {
+ if (my_reboot(LINUX_REBOOT_CMD_CAD_ON) < 0)
+ err(EXIT_FAILURE, "reboot");
+ } else if (argc == 2 && !strcmp("soft", argv[1])) {
+ if (my_reboot(LINUX_REBOOT_CMD_CAD_OFF) < 0)
+ err(EXIT_FAILURE, "reboot");
+ } else
+ errx(EXIT_FAILURE, _("Usage: %s hard|soft"),
+ program_invocation_short_name);
+ return EXIT_SUCCESS;
+}
diff --git a/text-utils/column.c b/text-utils/column.c
index e7cd3346..87a6fc79 100644
--- a/text-utils/column.c
+++ b/text-utils/column.c
@@ -64,6 +64,11 @@ static char *mtsafe_strtok(char *, const char *, char **);
#define wcstok mtsafe_strtok
#endif
+#define DEFCOLS 25
+#define TAB 8
+#define DEFNUM 1000
+#define MAXLINELEN (LINE_MAX + 1)
+
static void c_columnate __P((void));
static void *emalloc __P((int));
static void input __P((FILE *));
@@ -71,6 +76,11 @@ static void maketbl __P((void));
static void print __P((void));
static void r_columnate __P((void));
+typedef struct _tbl {
+ wchar_t **list;
+ int cols, *len;
+} TBL;
+
int termwidth = 80; /* default terminal width */
int entries; /* number of records */
@@ -131,8 +141,8 @@ main(int argc, char **argv)
switch(ch) {
case 'h':
case '?':
- usage(EXIT_SUCCESS);
- break;
+ usage(EXIT_SUCCESS);
+ break;
case 'c':
termwidth = atoi(optarg);
break;
@@ -147,20 +157,23 @@ main(int argc, char **argv)
break;
default:
usage(EXIT_FAILURE);
- }
+ }
argc -= optind;
argv += optind;
if (!*argv)
input(stdin);
- else for (; *argv; ++argv)
- if ((fp = fopen(*argv, "r")) != NULL) {
- input(fp);
- (void)fclose(fp);
- } else {
- warn("%s", *argv);
- eval = 1;
+ else {
+ for (; *argv; ++argv) {
+ if ((fp = fopen(*argv, "r")) != NULL) {
+ input(fp);
+ (void)fclose(fp);
+ } else {
+ warn("%s", *argv);
+ eval = EXIT_FAILURE;
+ }
}
+ }
if (!entries)
exit(eval);
@@ -174,11 +187,10 @@ main(int argc, char **argv)
else
r_columnate();
if (ferror(stdout) || fclose(stdout))
- eval = 1;
+ eval = EXIT_FAILURE;
exit(eval);
}
-#define TAB 8
static void
c_columnate()
{
@@ -217,7 +229,7 @@ r_columnate()
maxlength = (maxlength + TAB) & ~(TAB - 1);
numcols = termwidth / maxlength;
if (!numcols)
- numcols = 1;
+ numcols = 1;
numrows = entries / numcols;
if (entries % numcols)
++numrows;
@@ -251,12 +263,6 @@ print()
}
}
-typedef struct _tbl {
- wchar_t **list;
- int cols, *len;
-} TBL;
-#define DEFCOLS 25
-
static void
maketbl()
{
@@ -272,48 +278,47 @@ maketbl()
cols = emalloc((maxcols = DEFCOLS) * sizeof(wchar_t *));
lens = emalloc(maxcols * sizeof(int));
for (cnt = 0, lp = list; cnt < entries; ++cnt, ++lp, ++t) {
- for (coloff = 0, p = *lp;
- (cols[coloff] = wcstok(p, separator, &wcstok_state)) != NULL;
- p = NULL)
- if (++coloff == maxcols) {
- if (!(cols = realloc(cols, ((u_int)maxcols + DEFCOLS)
- * sizeof(wchar_t *))) ||
- !(lens = realloc(lens, ((u_int)maxcols + DEFCOLS)
- * sizeof(int))))
- err(1, NULL);
- memset((char *)lens + maxcols * sizeof(int),
- 0, DEFCOLS * sizeof(int));
- maxcols += DEFCOLS;
+ for (coloff = 0, p = *lp;
+ (cols[coloff] = wcstok(p, separator, &wcstok_state)) != NULL;
+ p = NULL) {
+ if (++coloff == maxcols) {
+ cols = realloc(cols, ((u_int)maxcols + DEFCOLS)
+ * sizeof(wchar_t *));
+ lens = realloc(lens, ((u_int)maxcols + DEFCOLS)
+ * sizeof(int));
+ if (!cols || !lens)
+ err(EXIT_FAILURE, _("out of memory?"));
+ memset((char *)lens + maxcols * sizeof(int),
+ 0, DEFCOLS * sizeof(int));
+ maxcols += DEFCOLS;
+ }
+ }
+ t->list = emalloc(coloff * sizeof(wchar_t *));
+ t->len = emalloc(coloff * sizeof(int));
+ for (t->cols = coloff; --coloff >= 0;) {
+ t->list[coloff] = cols[coloff];
+ t->len[coloff] = wcs_width(cols[coloff]);
+ if (t->len[coloff] > lens[coloff])
+ lens[coloff] = t->len[coloff];
}
- t->list = emalloc(coloff * sizeof(wchar_t *));
- t->len = emalloc(coloff * sizeof(int));
- for (t->cols = coloff; --coloff >= 0;) {
- t->list[coloff] = cols[coloff];
- t->len[coloff] = wcs_width(cols[coloff]);
- if (t->len[coloff] > lens[coloff])
- lens[coloff] = t->len[coloff];
- }
}
for (cnt = 0, t = tbl; cnt < entries; ++cnt, ++t) {
- for (coloff = 0; coloff < t->cols - 1; ++coloff) {
+ for (coloff = 0; coloff < t->cols - 1; ++coloff) {
+ fputws(t->list[coloff], stdout);
+ for (i = lens[coloff] - t->len[coloff] + 2; i > 0; i--)
+ putwchar(' ');
+ }
fputws(t->list[coloff], stdout);
- for (i = lens[coloff] - t->len[coloff] + 2; i > 0; i--)
- putwchar(' ');
- }
- fputws(t->list[coloff], stdout);
- putwchar('\n');
+ putwchar('\n');
}
}
-#define DEFNUM 1000
-#define MAXLINELEN (LINE_MAX + 1)
-
static void
input(fp)
FILE *fp;
{
static int maxentry;
- int len;
+ int len, lineno = 1, reportedline = 0;
wchar_t *p, buf[MAXLINELEN];
if (!list)
@@ -322,20 +327,26 @@ input(fp)
for (p = buf; *p && iswspace(*p); ++p);
if (!*p)
continue;
- if (!(p = wcschr(p, '\n'))) {
- warnx(_("line too long"));
- eval = 1;
+ if (!(p = wcschr(p, '\n')) && !feof(fp)) {
+ if (reportedline < lineno) {
+ warnx(_("line %d is too long, output will be truncated"),
+ lineno);
+ reportedline = lineno;
+ }
+ eval = EXIT_FAILURE;
continue;
}
- *p = '\0';
+ lineno++;
+ if (!feof(fp))
+ *p = '\0';
len = wcs_width(buf); /* len = p - buf; */
if (maxlength < len)
maxlength = len;
if (entries == maxentry) {
maxentry += DEFNUM;
- if (!(list = realloc(list,
- (u_int)maxentry * sizeof(wchar_t *))))
- err(1, NULL);
+ list = realloc(list, (u_int)maxentry * sizeof(wchar_t *));
+ if (!list)
+ err(EXIT_FAILURE, _("out of memory?"));
}
list[entries++] = wcsdup(buf);
}
@@ -385,14 +396,12 @@ static char *mtsafe_strtok(char *str, const char *delim, char **ptr)
static void *
emalloc(size)
- int size;
+ int size;
{
char *p;
if (!(p = malloc(size)))
- err(1, NULL);
+ err(EXIT_FAILURE, _("out of memory?"));
memset(p, 0, size);
return (p);
}
-
-