include/env.h \
include/exec_shell.h \
include/exitcodes.h \
+ include/fgetwc_or_err.h \
include/fileeq.h \
include/fileutils.h \
include/fuzz.h \
--- /dev/null
+#ifndef UTIL_LINUX_FGETWC_OR_ERR_H
+#define UTIL_LINUX_FGETWC_OR_ERR_H
+
+#include <stdio.h>
+#include <wchar.h>
+#include <errno.h>
+
+#include "widechar.h"
+#include "c.h"
+#include "nls.h"
+
+static inline wint_t fgetwc_or_err(FILE *stream) {
+ wint_t ret;
+
+ errno = 0;
+ ret = fgetwc(stream);
+ if (ret == WEOF && errno != 0)
+ err(EXIT_FAILURE, _("fgetwc() failed"));
+
+ return ret;
+}
+
+#endif /* _FGETWC_OR_ERR_H */
- W U; U; D f U; D f D f > @W ]~ K- - ---- -- -- - -- -- ---- -- ---- -- - -- --- --
-return value: 0
+return value: 1
--- /dev/null
+colcrt: fgetwc() failed: Invalid or incomplete multibyte or wide character
MN9|
XYZ nT RnTUV| NXP:w
-
-MNOP.return value: 0
+return value: 1
--- /dev/null
+colcrt: fgetwc() failed: Invalid or incomplete multibyte or wide character
789:;<=>=>?IABUVNXYZ[ `abcdefgg !"#$%&'()*+,-./01234)*:,-./0123456789:;[=>?1234)*:,-./0123456789:;[=>?4456789:;<=>?IABUVN`abcdefg !"
-
-return value: 0
+return value: 1
--- /dev/null
+colcrt: fgetwc() failed: Invalid or incomplete multibyte or wide character
ts_init_subtest ${1##*/}
timeout 2 env LC_ALL=C.UTF-8 $TS_CMD_COLCRT < $1 >> $TS_OUTPUT 2>> $TS_ERRLOG
echo "return value: $?" >> $TS_OUTPUT
+ sed -i -e 's/Illegal byte sequence/Invalid or incomplete multibyte or wide character/' $TS_ERRLOG
ts_finalize_subtest
}
#include "c.h"
#include "widechar.h"
#include "closestream.h"
+#include "fgetwc_or_err.h"
/*
* colcrt - replaces col for crts with new nroff esp. when using tbl.
errno = 0;
old_pos = ftell(ctl->f);
- while (fgetwc(ctl->f) != L'\n') {
+ while (fgetwc_or_err(ctl->f) != L'\n') {
long new_pos;
if (ferror(ctl->f) || feof(ctl->f))
col = -1;
continue;
}
- c = fgetwc(ctl->f);
+ c = fgetwc_or_err(ctl->f);
switch (c) {
case 033: /* ESC */
- c = fgetwc(ctl->f);
+ c = fgetwc_or_err(ctl->f);
if (c == L'8') {
col = rubchars(ctl, col, 1);
continue;
#include "c.h"
#include "widechar.h"
#include "closestream.h"
+#include "fgetwc_or_err.h"
/*
COLRM removes unwanted columns from a file
int padding;
for (;;) {
- c = fgetwc(stdin);
+ c = fgetwc_or_err(stdin);
if (c == WEOF)
return 0;
if (c == '\t')
/* Loop getting rid of characters */
while (!last || ct < last) {
- c = fgetwc(stdin);
+ c = fgetwc_or_err(stdin);
if (c == WEOF)
return 0;
if (c == '\n') {
/* Output last of the line */
for (;;) {
- c = fgetwc(stdin);
+ c = fgetwc_or_err(stdin);
if (c == WEOF)
break;
if (c == '\n') {
#include "widechar.h"
#include "c.h"
#include "closestream.h"
+#include "fgetwc_or_err.h"
static void sig_handler(int signo __attribute__ ((__unused__)))
{
{
size_t r = 0;
while (r < n) {
- wint_t c = fgetwc(stream);
+ wint_t c = fgetwc_or_err(stream);
if (c == WEOF)
break;
str[r++] = c;
#include "widechar.h"
#include "c.h"
#include "closestream.h"
+#include "fgetwc_or_err.h"
#define ESC '\033'
#define SO '\016'
{
wint_t c;
- switch (c = fgetwc(f)) {
+ switch (c = fgetwc_or_err(f)) {
case HREV:
if (0 < ctl->half_position) {
ctl->mode &= ~SUBSCRIPT;
wint_t c;
int i, width;
- while ((c = fgetwc(f)) != WEOF) {
+ while ((c = fgetwc_or_err(f)) != WEOF) {
switch (c) {
case '\b':
set_column(ctl, ctl->column && 0 < ctl->column ? ctl->column - 1 : 0);
continue;
case ESC:
if (handle_escape(ctl, tcs, f)) {
- c = fgetwc(f);
+ c = fgetwc_or_err(f);
errx(EXIT_FAILURE,
_("unknown escape sequence in input: %o, %o"), ESC, c);
}