diff options
-rw-r--r-- | Makefile.am | 3 | ||||
-rw-r--r-- | configure.ac | 1 | ||||
-rw-r--r-- | include/xalloc.h | 46 | ||||
-rw-r--r-- | lib/Makefile.am | 3 | ||||
-rw-r--r-- | lib/canonicalize.c | 14 | ||||
-rw-r--r-- | man/ru/Makefile.am | 5 | ||||
-rw-r--r-- | man/ru/ddate.1 | 123 | ||||
-rw-r--r-- | misc-utils/look.c | 50 | ||||
-rw-r--r-- | misc-utils/namei.c | 6 | ||||
-rw-r--r-- | misc-utils/rename.c | 8 | ||||
-rw-r--r-- | misc-utils/setterm.c | 1 | ||||
-rw-r--r-- | misc-utils/wipefs.c | 10 | ||||
-rw-r--r-- | mount/mount.8 | 5 | ||||
-rw-r--r-- | mount/umount.c | 15 | ||||
-rw-r--r-- | shlibs/blkid/src/dev.c | 2 | ||||
-rw-r--r-- | sys-utils/ctrlaltdel.c | 47 | ||||
-rw-r--r-- | text-utils/column.c | 129 |
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); } - - |